C#如何在OnClick中更改MenuItem的文本

时间:2017-06-04 19:35:10

标签: c# windows winforms

我正在尝试更改MenuItemContextMenu的文字。我以为我以前做过这个,但我记不起来了。

这就是我所拥有的:

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

现在它有效。

是不是因为我在点击后过早地尝试更改项目上的文字?

1 个答案:

答案 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;
}

如果现在senderItemfirstItem相同,那么此代码的作用如下:

  1. 检查文字是否为Pause
  2. 将文字更改为Unpause
  3. shouldPause设为true
  4. 检查文字是否为Unpause
  5. 将文字更改为Pause
  6. shouldPause设为false
  7. 所以基本上,因为它们是单独的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;
    }
    

    现在,只有其中一个分支会运行。