gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:47:55 25 4
gpt4 key购买 nike

我正在尝试从另一个线程更改菜单项。我可以在其他控件上使用 InvokeRequired/Invoke,但由于菜单项不是控件,因此我很难实现相同的功能。

对于其他控件,我是这样做的:

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

它完成了工作。

谁能帮我解决这里的菜单项?

谢谢你,-巴斯卡尔

最佳答案

菜单项不是控件,但托管菜单条的窗体是。因此,如果在正确的线程中调用,该形式的方法可以修改菜单项。

所以,

private void EnableMenuItem(ToolStripMenuItem item, bool enabled)
{
this.BeginInvoke(new MethodInvoker(delegate()
{
item.Enabled = enabled;
}
));
}

可能会做你想做的事。请注意,使用匿名方法进行保存必须定义一个(可能)不会在其他地方使用的委托(delegate)。

另外,顺便说一句,您正在使用的 Control.Invoke 重载的第二个参数标有参数 [] - 这就是 c# 实现可变数量参数的方式。您不必构造对象数组,只需添加所需数量的对象作为参数即可。

例如,

control.Invoke(new SetControlEnableHandler(SetControlEnabled), new object[] { sender, bValue } );

可以写成

control.Invoke( new SetControlEnableHandler(SetControlEnabled), sender, bValue);

它好多了,我相信你会同意的。

关于c# - 从另一个线程启用/禁用菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5042582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com