我是測試我在我的應用程序中遇到一個奇怪的錯誤,最後能夠創建一個簡單的再現:ContexMenuStrip特定奇怪的怪異行爲
using System;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var notifyIcon1 = new NotifyIcon();
notifyIcon1.Icon = new Form().Icon;
notifyIcon1.Visible = true;
var contextMenuStrip1 = new ContextMenuStrip();
ToolStripMenuItem menu1 = new ToolStripMenuItem();
menu1.Text = "test";
contextMenuStrip1.Items.Add(menu1);
contextMenuStrip1.Items.Add("t1");
contextMenuStrip1.Items.Add("t2");
notifyIcon1.ContextMenuStrip = contextMenuStrip1;
var timer = new System.Timers.Timer();
timer.Interval = 3000;
timer.Elapsed += (sender, e) => /* Runs in a different thread from UI thread.*/
{
if (contextMenuStrip1.InvokeRequired)
contextMenuStrip1.Invoke(new Action(() =>
{
menu1.DropDownItems.Add(e.SignalTime.ToString() + "extra");
menu1.DropDownItems.Add(e.SignalTime.ToString());
}));
else
{
menu1.DropDownItems.Add(e.SignalTime.ToString() + "extra");
menu1.DropDownItems.Add(e.SignalTime.ToString());
}
};
timer.Start();
Application.Run();
}
}
注意上下文菜單中不會公開,但這樣做的任何允許它打開:
- 刪除每次執行時添加的「額外」下拉項目。 (爲了精確 僅添加0或1每個執行作品)
- 上
InvokeRequired == false
卸下的代碼的一部分(這允許添加每執行多個項目) - 卸下
t1
和t2
元件。 (它仍然在沒有 根目錄中的其他項目)
這是一個錯誤還是我做錯了什麼?
編輯: 附加到的情況(感謝@derape):
- 如果移動else分支到單獨的方法,但如果你在InvokeRequired分支機構使用同樣的方法它的工作原理。但是,使用2個方法的名稱和代碼的作用不同。
可能的解決方法可能是在滿月跳舞時穿老虎皮。
嗯,這真的很奇怪。我看到了同樣的行爲。如果我從else分支中提取代碼到它的工作方式中...... – derape
@derape在這裏也是一樣,但如果您在InvokeRequired分支中調用相同的方法,它將不起作用。這真的是bizzare。此外,如果您然後以不同的名稱複製此方法,併爲InvokeRequired分支使用一個副本,並在其他分支中複製它再次工作。 –