菜单项的 checkedchange事件,为何比click事件早触发呢?
单击后,才会使菜单项的 checked 属性发生变化呀?然后才触发 checkedchanged事件。
但是,我试了,确实是先触发 checkedchanged事件。然后才是 click事件。不信,大家试一下
单击后,才会使菜单项的 checked 属性发生变化呀?然后才触发 checkedchanged事件。
但是,我试了,确实是先触发 checkedchanged事件。然后才是 click事件。不信,大家试一下
但是此时,mousedown事件会触发
// 楼主,据我所知,CheckChanged 事件是不会自动触发的,我试过了
// 楼主是否写了类似于如下的代码:
private void menuItem_Click(object sender, EventArgs e)
{
menuItem.Checked = !menuItem.Checked;
// ......
}// 如果是这样的话,CheckChanged 事件先触发,你觉得不合理吗?呵呵
// Checked 属性改变就会触发 CheckChanged 事件呀。
菜单项 的 checkedonclick 属性呀。
设成 true,你试试。
// 楼主呀,Reflector 说的很明白了
protected override void OnClick(EventArgs e)
{
if (this.checkOnClick)
{
this.Checked = !this.Checked;
}
base.OnClick(e);
if (this.nativeMenuCommandID != -1)
{
if ((this.nativeMenuCommandID & 0xf000) != 0)
{
UnsafeNativeMethods.PostMessage(new HandleRef(this, this.targetWindowHandle), 0x112, this.nativeMenuCommandID, 0);
}
else
{
UnsafeNativeMethods.PostMessage(new HandleRef(this, this.targetWindowHandle), 0x111, this.nativeMenuCommandID, 0);
}
base.Invalidate();
}
}// 你设成 CheckOnClick 只是少费些事,系统帮你做了,否则你自己做,这个我的代码是一个思路。
this.Checked = !this.Checked;赋值操作将执行Checked的Setter,如下
public bool Checked
{
get
{
return (this.CheckState != System.Windows.Forms.CheckState.Unchecked);
}
set
{
if (value != this.Checked)
{
this.CheckState = value ? System.Windows.Forms.CheckState.Checked : System.Windows.Forms.CheckState.Unchecked;
base.InvokePaint();
}
}
}
而Checked的Setter中的this.CheckState = 赋值操作将执行如下:
base.Properties.SetInteger(PropCheckState, (int) value);
this.OnCheckedChanged(EventArgs.Empty);
this.OnCheckStateChanged(EventArgs.Empty);
查看上面的执行时机,最好才执行base.OnClick(e);
是呀,也就是 CheckOnClick 属性为 True 才做。否则就自己设置