我正在尝试更改MenuItem
内ContextMenu
的文字。我以为我以前做过这个,但我记不起来了。
这就是我所拥有的:
private void TrayIcon_Click(object sender, EventArgs e)
{
MessageBox.Show(((MenuItem)sender).Text);
if(((MenuItem)sender).Text.Equals("Pause"))
{
icon.ContextMenu.MenuItems[0].Text = "Unpause";
shouldPause = true;
}
if(((MenuItem)sender).Text.Equals("Unpause"))
{
icon.ContextMenu.MenuItems[0].Text = "Pause";
shouldPause = false;
}
if(((MenuItem)sender).Text.Equals("Exit"))
{
icon.Visible = false;
Application.Exit();
}
}
当我尝试将“暂停”更改为“取消暂停”时,它不起作用。但是,如果我尝试将“暂停”更改为“披萨”,它实际上是有效的..那是什么......
全部谢谢!
编辑:
将我的代码更改为以下内容:
private void TrayIcon_Click(object sender, EventArgs e)
{
if(((MenuItem)sender).Text.Equals("Pause"))
{
shouldPause = true;
}
if(((MenuItem)sender).Text.Equals("Unpause"))
{
shouldPause = false;
}
if(((MenuItem)sender).Text.Equals("Exit"))
{
icon.Visible = false;
Application.Exit();
}
string text = "Pause";
if(shouldPause)
{
text = "Unpause";
}
icon.ContextMenu.MenuItems[0].Text = text;
}
现在它有效。
是不是因为我在点击后过早地尝试更改项目上的文字?
答案 0 :(得分:2)
根据您的观察,我假设icon.ContextMenu.MenuItems[0]
和(MenuItem)sender
是相同的菜单项。
这可以解释为什么它不适用于您的第一个代码:
if(((MenuItem)sender).Text.Equals("Pause"))
{
icon.ContextMenu.MenuItems[0].Text = "Unpause";
shouldPause = true;
}
if(((MenuItem)sender).Text.Equals("Unpause"))
{
icon.ContextMenu.MenuItems[0].Text = "Pause";
shouldPause = false;
}
引入局部变量时,问题会变得更加清晰:
var senderItem = (MenuItem)sender;
var firstItem = icon.ContextMenu.MenuItems[0];
if(senderItem.Text.Equals("Pause"))
{
firstItem.Text = "Unpause";
shouldPause = true;
}
if(senderItem.Text.Equals("Unpause"))
{
firstItem.Text = "Pause";
shouldPause = false;
}
如果现在senderItem
和firstItem
相同,那么此代码的作用如下:
Pause
Unpause
shouldPause
设为true Unpause
Pause
shouldPause
设为false 所以基本上,因为它们是单独的if
,所以它们都运行,第二次覆盖第一个。
您通常可以使用else if
代替多个单独/不感知if
来避免这种情况:
if(senderItem.Text.Equals("Pause"))
{
firstItem.Text = "Unpause";
shouldPause = true;
}
else if(senderItem.Text.Equals("Unpause"))
{
firstItem.Text = "Pause";
shouldPause = false;
}
现在,只有其中一个分支会运行。