在 .NET 5/6 win 表单的托盘图标上实现菜单

Nod*_*ink 7 .net c# .net-core .net-5

在没有主窗体的 .NET Framework 4.8 winform 应用程序中,我有以下代码:

    [STAThread]
    public static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Daemon());
    }
Run Code Online (Sandbox Code Playgroud)
    public class Daemon : ApplicationContext
    {
        private readonly NotifyIcon trayIcon;

        public Daemon()
        {
            trayIcon = new NotifyIcon()
            {
                Icon = "icon.ico",
                ContextMenu = new ContextMenu(new MenuItem[]
                { 
                    new MenuItem("OPEN", new EventHandler(Open)),
                    new MenuItem("SETTINGS", new EventHandler(Settings)),
                    new MenuItem("EXIT", new EventHandler(Exit))
                }),
                Visible = true
            };
        }
    }
Run Code Online (Sandbox Code Playgroud)

在 .NET 5(或 6)win 表单应用程序中,该NotifyIcon对象没有ContextMenu属性,但ContextMenuStrip我不明白如何使用。

如何为没有主窗体的应用程序在尝试图标上创建一个简单的菜单?

Mar*_*ese 13

与接受的答案相同,但稍微简洁一些,无论好坏:

public Daemon()
{
    trayIcon = new NotifyIcon()
    {
        Icon = new Icon("icon.ico"),
        ContextMenuStrip = new ContextMenuStrip()
        {
            Items = 
            {
                new ToolStripMenuItem("OPEN", null, new EventHandler(Open), "OPEN"),
                new ToolStripMenuItem("SETTINGS", null, new EventHandler(Settings), "SETTINGS"),
                new ToolStripMenuItem("EXIT", null, new EventHandler(Exit), "EXIT")
            }
        },
        Visible = true
    };
}
Run Code Online (Sandbox Code Playgroud)

如果该Items = {...}语法看起来很奇怪,请参阅此处

此外,下表显示了 .NET Core 3 中删除的 Windows 窗体类及其相应的替换项。


Nod*_*ink 9

这比预期的要简单。

public Daemon()
{
    trayIcon = new NotifyIcon()
    {
        Icon = new Icon("icon.ico"),
        ContextMenuStrip = new ContextMenuStrip(),
        Visible = true
    };

    trayIcon.ContextMenuStrip.Items.AddRange(new ToolStripItem[]
    {
        new ToolStripMenuItem("OPEN", null, new EventHandler(Open), "OPEN"),
        new ToolStripMenuItem("SETTINGS", null, new EventHandler(Settings), "SETTINGS"),
        new ToolStripMenuItem("EXIT", null, new EventHandler(Exit), "EXIT")
    });
}
Run Code Online (Sandbox Code Playgroud)