111,094
社区成员




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");
}
}
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.Click +=new EventHandler(SubMenuBt_Click);
}
public bool Checked { get; set; }
private void SubMenuBt_Click(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Down.png");
sbt.Checked = true;
foreach (Control c in sbt.Parent.Controls) //这句我还是要用,要不然我不知道怎么恢复上一个的状态
{
if (c is SubMenuBt)
{
SubMenuBt bt = c as SubMenuBt;
if (bt.Checked == true && bt!= sbt)
{
bt.Checked = false;
bt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
break;
}
}
}
}
private void SubMenuBt_MouseEnter(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
if (sbt.Checked == false)
{
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景In.png");
}
}
private void SubMenuBt_MouseLeave(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
if (sbt.Checked == false)
{
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
}
}
}
foreach (Control c in sbt.Parent.Controls)
这种越俎代庖的想当然地逻辑。这种代码应该用在 Automation 测试程序中,而不是用在正式产品中。
一个按钮显示什么状态的背景图,用它的 Checked 来关联就行了。一个按钮不要去想当然去捕获什么“上级控件的其它下级控件”这种逻辑。
对于它的宿主控件,假设需要切换,那么监听所有按钮的 Check 事件,并且在处理时把其它所有按钮的 Checked 属性设展为false,那么其它按钮也就自动改变背景了。这样写出来的代码少、准确。
编程要少写代码,头脑也是一样。你纠缠到底层的 MouseEnter、MouseLeave等等东西,在上面大做文章,不如把更多精力放在高层次的 Checked 上,放在高层数据的业务逻辑上,而不是放在底层机制上。这样写出来的代码就少、且准确。