簡體   English   中英

從另一個線程啟用/禁用菜單項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM