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方法吗?或者我应该重做它,让它把所有的更新都封装在一个方法中吗?我不知道你的代码是做什么的,但是如果你认为在按钮事件中调用它是有意义的,那么肯定会起作用。