我正在创建一个带有上下文菜单的托盘图标应用程序,其中包含3个项目.托盘图标用于控制服务的运行,因此用户可以快速启动或停止该服务.根据服务状态,如果服务已在运行,我想禁用Start
按钮.
我面临的问题是,它只在第二次打开菜单后才更新上下文菜单.
例如:服务正在运行,因此应该禁用"Start"按钮.一旦我点击Stop
,我需要打开上下文菜单两次,它才能更新并启用Start
按钮.
有没有比我在这里创建的更好的方法来更新上下文菜单?
class TrayApp : ApplicationContext
{
private NotifyIcon trayIcon;
private ServiceController sc;
public TrayApp()
{
sc = new ServiceController("RamLogger");
trayIcon = new NotifyIcon()
{
Icon = Properties.Resources.icon1,
Text = "RamLogger",
ContextMenu = GetContextMenu(),
Visible = true
};
trayIcon.MouseClick += new MouseEventHandler(OnClick);
}
void OnClick(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right)
{
trayIcon.ContextMenu = GetContextMenu();
}
}
private ContextMenu GetContextMenu()
{
sc.Refresh();
ContextMenu cm = new ContextMenu();
cm.MenuItems.Clear();
if (sc.Status == ServiceControllerStatus.Running || sc.Status == ServiceControllerStatus.StartPending)
{
cm.MenuItems.Add(new MenuItem("Status: Running"));
cm.MenuItems.Add(new MenuItem("-"));
cm.MenuItems.Add(new MenuItem("Start", Start) { Enabled = false });
cm.MenuItems.Add(new MenuItem("Stop", Stop) { Enabled = true });
}
else
{
cm.MenuItems.Add(new MenuItem("Status: Stopped"));
cm.MenuItems.Add(new MenuItem("-"));
cm.MenuItems.Add(new MenuItem("Start", Start) { Enabled = true });
cm.MenuItems.Add(new MenuItem("Stop", Stop) { Enabled = false });
}
return cm;
}
}