从另一个线程启用/禁用菜单项

时间:2011-02-18 14:38:19

标签: c#

我正在尝试从另一个线程更改菜单项。我可以在其他控件上使用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

1 个答案:

答案 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);

它更好,我相信你会同意。