[英]Enabling/Disabling the menu item from another thread
我試圖從另一個線程更改菜單項。 我可以在其他控件上使用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
菜單項不是控件,但是托管菜單條的窗體是控件。 因此,這種形式的方法(如果在正確的線程中調用)可以修改菜單項。
所以,
private void EnableMenuItem(ToolStripMenuItem item, bool enabled)
{
this.BeginInvoke(new MethodInvoker(delegate()
{
item.Enabled = enabled;
}
));
}
可能會做你想要的。 請注意,使用匿名方法保存必須定義一個(可能)不會在其他地方使用的委托。
另外,順便說一句,您正在使用的Control.Invoke的重載有第二個參數標記為params []-這是c#如何填充可變數量的參數。 您不必構造對象數組,只需添加所需數量的對象作為參數即可。
例如,
control.Invoke(new SetControlEnableHandler(SetControlEnabled), new object[] { sender, bValue } );
可以寫成
control.Invoke( new SetControlEnableHandler(SetControlEnabled), sender, bValue);
更好,我敢肯定你會同意的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.