我正在尝试从另一个线程更改菜单项。我可以在其他控件上使用InvokeRequired / Invoke,但由于菜单项不是Control,我很难实现相同的功能。
对于其他控件,我这样做:
private delegate void SetControlEnableHandler(object sender, Boolean bValue);
private void SetControlEnabled(object sender, Boolean bValue)
{
Control control = (Control)sender;
if (control.InvokeRequired)
control.Invoke(
new SetControlEnableHandler(SetControlEnabled),
new object[] { sender, bValue }
);
else
control.Enabled = bValue;
}
从工作线程我简单地调用:
this.SetControlEnabled(btnPress, true);
它完成了这项工作。
有人可以帮我处理菜单项吗?
谢谢你, -Bhaskar
答案 0 :(得分:5)
菜单项不是控件,但托管menustrip的表单是。因此,如果在正确的线程中调用,那么该形式的方法可以修改menuitem。
所以,
private void EnableMenuItem(ToolStripMenuItem item, bool enabled)
{
this.BeginInvoke(new MethodInvoker(delegate()
{
item.Enabled = enabled;
}
));
}
可能会做你想要的。请注意,使用匿名方法进行保存必须定义一个(可能)不会在别处使用的委托。
另外,顺便说一句,您正在使用的Control.Invoke的重载具有标记为params []的第二个参数 - 这就是c#inplements变量数量的参数。您不必配置对象数组,只需添加所需的对象作为参数即可。
例如,
control.Invoke(new SetControlEnableHandler(SetControlEnabled), new object[] { sender, bValue } );
可以写成
control.Invoke( new SetControlEnableHandler(SetControlEnabled), sender, bValue);
它更好,我相信你会同意。