C# 如何正确刷新上下文菜单条

C# 如何正确刷新上下文菜单条,c#,winforms,C#,Winforms,目前,我一直在想如何正确地刷新上下文菜单条。我试过几种不同的方法,但没有一种有效。基本概念很简单。托盘应用程序显示一个上下文菜单条,允许您启动服务或在服务已经运行时停止服务。它应该每隔几秒钟更新或刷新一次,以查看状态,然后相应地显示项目。现在我似乎无法让它正常刷新,需要一些指导 这是Main方法 static void Main(string[] args) { Application.SetHighDpiMode(HighDpiMode.SystemAware); Applic

目前,我一直在想如何正确地刷新上下文菜单条。我试过几种不同的方法,但没有一种有效。基本概念很简单。托盘应用程序显示一个上下文菜单条,允许您启动服务或在服务已经运行时停止服务。它应该每隔几秒钟更新或刷新一次,以查看状态,然后相应地显示项目。现在我似乎无法让它正常刷新,需要一些指导

这是
Main
方法

static void Main(string[] args)
{
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    NotifyIcon trayicon = new NotifyIcon();
    trayicon.ContextMenuStrip = GetContext();
    trayicon.Icon = Properties.Resources.icon_error;
    trayicon.Visible = true;
    trayicon.Text = trayballoon;
    LoadSettings();
    Application.Run();
}
上下文菜单如下所示

static ContextMenuStrip GetContext()
{
    ContextMenuStrip CMS = new ContextMenuStrip();
    if (getStatus() == "Running")
    {
        CMS.Items.Add("Pause", null, new EventHandler(Stop_Click));
        CMS.Items.Add("Stop", null, new EventHandler(Stop_Click));
    }
    else
    {
        CMS.Items.Add("Start", null, new EventHandler(Start_Click));
    }

    CMS.Items.Add("Set Automatic", null, new EventHandler(Auto_Click));
    CMS.Items.Add("Set Manual", null, new EventHandler(Manual_Click));

    CMS.Items.Add("Exit", null, new EventHandler(Exit_Click));
    return CMS;
    
}

我不确定将刷新放在何处或如何访问它,它可能是
CMS.refresh()
,但除非在main方法中调用它,否则不会更新。任何洞察都将不胜感激

我不建议继续刷新上下文条。相反,只显示和隐藏您需要的项目要干净得多。该方法返回对新添加按钮的引用,因此您可以存储这些引用以供以后使用。然后根据需要使用属性来显示/隐藏它们。 例如:

// Somewhere to keep references to the buttons you need to modify
private static ToolStripItem _stopButton;
private static ToolStripItem _startButton;
private static ToolStripItem _pauseButton;

static ContextMenuStrip GetContext()
{
    ContextMenuStrip CMS = new ContextMenuStrip();

    // Store references to the buttons
    _pauseButton = CMS.Items.Add("Pause", null, new EventHandler(Stop_Click));
    _stopButton = CMS.Items.Add("Stop", null, new EventHandler(Stop_Click));
    _startButton = CMS.Items.Add("Start", null, new EventHandler(Start_Click));

    CMS.Items.Add("Set Automatic", null, new EventHandler(Auto_Click));
    CMS.Items.Add("Set Manual", null, new EventHandler(Manual_Click));

    CMS.Items.Add("Exit", null, new EventHandler(Exit_Click));
    return CMS;
}
public void SetButtonStatus(bool running)
{
    // Only show this when not running
    _startButton.Visible = !running; 

    _stopButton.Visible = running;
    _pauseButton .Visible = running;
}
然后在更改应用程序状态的方法中,例如:

// Somewhere to keep references to the buttons you need to modify
private static ToolStripItem _stopButton;
private static ToolStripItem _startButton;
private static ToolStripItem _pauseButton;

static ContextMenuStrip GetContext()
{
    ContextMenuStrip CMS = new ContextMenuStrip();

    // Store references to the buttons
    _pauseButton = CMS.Items.Add("Pause", null, new EventHandler(Stop_Click));
    _stopButton = CMS.Items.Add("Stop", null, new EventHandler(Stop_Click));
    _startButton = CMS.Items.Add("Start", null, new EventHandler(Start_Click));

    CMS.Items.Add("Set Automatic", null, new EventHandler(Auto_Click));
    CMS.Items.Add("Set Manual", null, new EventHandler(Manual_Click));

    CMS.Items.Add("Exit", null, new EventHandler(Exit_Click));
    return CMS;
}
public void SetButtonStatus(bool running)
{
    // Only show this when not running
    _startButton.Visible = !running; 

    _stopButton.Visible = running;
    _pauseButton .Visible = running;
}

我很确定这不是ASP.NET,你标记它有什么原因吗?另外,我不知道你为什么要刷新上下文条,只需更新现有的上下文条,它就应该重新绘制它需要的内容。我的建议是添加所有3个按钮,并根据需要显示/隐藏它们。@DavidG我将在哪里显示/隐藏?这会在get context方法中实现吗?显示/隐藏可以很好地代替刷新,我只是用它来描述我的目标,因为我希望菜单只显示有效的选项,然后更改托盘应用程序的图标。我标记了这个ASP.NET,因为整个应用程序都是C#和ASP.NET,所以我只想确保我涵盖了所有的基础。目前,每次单击的状态都会发生变化,所以“开始单击”会更改它,而“停止单击”会更改它。我会在每个click方法中运行SetRunning方法吗?或者我应该重做它,让它把所有的更新都封装在一个方法中吗?我不知道你的代码是做什么的,但是如果你认为在按钮事件中调用它是有意义的,那么肯定会起作用。