You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework Winforms实现MenuItem父项直接触发与子菜单按需显示

实现NotifyIcon父菜单项直接触发默认逻辑,仅悬停/点击箭头展开子菜单

在.NET Framework 4.8.1的WinForms中,要实现这个需求,你需要将父菜单项的点击逻辑和子菜单展开功能分离,而不是直接将子菜单作为父菜单项的构造参数传入。具体实现如下:

核心思路

  1. 单独创建父菜单项,绑定默认逻辑的点击事件(即Italic的打开逻辑)
  2. 创建子菜单集合,将子菜单项添加到父菜单项的DropDown菜单中
  3. 可选:处理子菜单项的单选勾选状态,确保默认选项(Italic)初始为勾选状态

完整代码示例

// 初始化子菜单项,默认勾选Italic
MenuItem[] submenu = new MenuItem[]
{
    new MenuItem("Italic", OpenItalic) { DefaultItem = true, Checked = true },
    new MenuItem("Bold", OpenBold),
    new MenuItem("Underline", OpenUnderline)
};

// 创建父菜单项,绑定默认点击逻辑(直接触发Italic)
MenuItem showTextMenuItem = new MenuItem("Show text");
showTextMenuItem.Click += OpenItalic;

// 将子菜单项添加到父菜单项的DropDown菜单中
foreach (MenuItem subItem in submenu)
{
    showTextMenuItem.DropDown.MenuItems.Add(subItem);
}

// 构建上下文菜单并绑定到NotifyIcon
icon = new NotifyIcon()
{
    ContextMenu = new ContextMenu(new MenuItem[] { showTextMenuItem }),
    Icon = new System.Drawing.Icon("instance.ico"),
    Visible = true,
    Text = "test"
};

// 子菜单项点击事件示例(处理单选勾选+业务逻辑)
private void OpenItalic(object sender, EventArgs e)
{
    // 单选逻辑:取消其他子菜单项的勾选
    MenuItem clickedItem = (MenuItem)sender;
    if (clickedItem.Parent != null)
    {
        foreach (MenuItem item in clickedItem.Parent.MenuItems)
        {
            item.Checked = false;
        }
    }
    clickedItem.Checked = true;

    // 执行Italic样式的打开窗体逻辑
    // 示例:new ItalicTextForm().Show();
}

private void OpenBold(object sender, EventArgs e)
{
    MenuItem clickedItem = (MenuItem)sender;
    if (clickedItem.Parent != null)
    {
        foreach (MenuItem item in clickedItem.Parent.MenuItems)
        {
            item.Checked = false;
        }
    }
    clickedItem.Checked = true;

    // 执行Bold样式的打开窗体逻辑
    // 示例:new BoldTextForm().Show();
}

private void OpenUnderline(object sender, EventArgs e)
{
    MenuItem clickedItem = (MenuItem)sender;
    if (clickedItem.Parent != null)
    {
        foreach (MenuItem item in clickedItem.Parent.MenuItems)
        {
            item.Checked = false;
        }
    }
    clickedItem.Checked = true;

    // 执行Underline样式的打开窗体逻辑
    // 示例:new UnderlineTextForm().Show();
}

效果说明

  • 点击父菜单项的文字部分("Show text")会直接触发OpenItalic逻辑,无需展开子菜单
  • 悬停在父菜单项上,或者点击父菜单项右侧的箭头,会展开子菜单,可选择其他选项
  • 子菜单项默认勾选Italic,点击其他选项时会自动取消之前的勾选(若需要多选,可删除勾选处理代码)

内容的提问来源于stack exchange,提问作者Darshana Suresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:55:26