按钮的互斥事件实现

antique_star antique_star 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

各位前辈,在做折叠菜单中的二级菜单的鼠标事件时,遇到互斥事件。


实现的效果就是,处于点击状态的按钮取消它的背景变换。同时恢复上一个的鼠标事件正常。
我做的效果,所有二级菜单按钮每一个在第一次点击时都达到了效果。但是第二次点击时,按下的效果就没有了,鼠标一离开就触发了离开事件。假象就是好像第二次点击没有解除掉它的离开与进入事件。


如果我的鼠标事件有问题,那为什么第一次又能正常解除它的离开与进入事件呢?
百思不得其解,请大神们看看代码哪里有问题。


先说明几个问题:
1、折叠菜单一级按钮我没有弄互斥效果,是通过两个Image和改变文本颜色来提醒用户;
2、折叠菜单实现原理:用FlowLayOutPanel的流式布局做主容器,每个一级菜单按钮下放一个Panel,一级菜单按钮的Tag与Panel设为相同索引号,在一级菜单的点击事件中循环容器中Panel控件的Tag,如果相同的就将Panel的高度设为0,达到折叠效果。
3、在二级菜单的Panel容器中放置按钮,这些按钮要求互斥,互斥的实现是变换背景图片。

代码如下:


public partial class SubMenuBt : Button
{
public SubMenuBt()
{
this.FlatStyle = FlatStyle.Flat;
this.FlatAppearance.BorderSize = 0;
this.Font = new Font("方正书宋简体", 10F);
this.Image = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单图标2.png");
this.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.BackgroundImageLayout = ImageLayout.Stretch;
this.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
this.Size = new Size(150, 25);
this.Margin = new Padding(0,1,0,0);
this.Checked = false;
this.MouseEnter +=new EventHandler(SubMenuBt_MouseEnter);
this.MouseLeave +=new EventHandler(SubMenuBt_MouseLeave);
this.MouseDown +=new MouseEventHandler(SubMenuBt_MouseDown);
this.Click +=new EventHandler(SubMenuBt_Click);
}

public bool Checked { get; set; }

private void SubMenuBt_Click(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
foreach (Control c in sbt.Parent.Controls)
{
if (c is SubMenuBt && c != sbt)
{
SubMenuBt bt = c as SubMenuBt;
if (bt.Checked == true)
{
bt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
bt.MouseEnter += new EventHandler(SubMenuBt_MouseEnter);
bt.MouseLeave += new EventHandler(SubMenuBt_MouseLeave);
bt.Checked = false;
}
}
}

if (sbt.Checked == false)
{
sbt.MouseEnter -= new EventHandler(SubMenuBt_MouseEnter);
sbt.MouseLeave -= new EventHandler(SubMenuBt_MouseLeave);
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Down.png");
sbt.Checked = true;
}
}

private void SubMenuBt_MouseEnter(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景In.png");
}

private void SubMenuBt_MouseLeave(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
}

private void SubMenuBt_MouseDown(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Down.png");
}
}

初始状态效果图: 点开状态效果图:



请大神们帮忙看看哪里需要完善!拜托了。
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
antique_star
C# 111,128 成员 642,536 内容