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

如何为ContextMenu实现嵌套子菜单功能?

实现WPF嵌套上下文菜单的正确方式

你当前的代码混用了WinForms控件(ToolStripDropDownMenu、ToolStripMenuItem)与WPF的ContextMenu,这会导致兼容性问题。WPF的上下文菜单体系需要用原生的MenuItem来构建嵌套结构,以下是符合需求的实现代码:

// 创建主上下文菜单实例
var contextMenu = new ContextMenu();

// 构建Version父菜单及子项
var versionParentItem = new MenuItem { Header = "Version" };
// 获取版本列表并添加为子菜单
foreach (var version in StaticHelpers.GetPackageVersions(textBlockSelected.Text))
{
    var versionSubItem = new MenuItem { Header = version };
    // 绑定子项点击事件(按需添加)
    versionSubItem.Click += (sender, e) =>
    {
        var selectedVersion = versionSubItem.Header.ToString();
        // 这里编写版本选择后的处理逻辑
    };
    versionParentItem.Items.Add(versionSubItem);
}

// 创建其他顶级菜单项
var scheduleItem = new MenuItem { Header = "Schedule" };
scheduleItem.Click += (sender, e) => { /* 处理Schedule选项的点击逻辑 */ };

var argumentsItem = new MenuItem { Header = "Arguments" };
argumentsItem.Click += (sender, e) => { /* 处理Arguments选项的点击逻辑 */ };

var removeItem = new MenuItem { Header = "Remove" };
removeItem.Click += (sender, e) => { /* 处理Remove选项的点击逻辑 */ };

// 将所有顶级菜单项添加到主上下文菜单
contextMenu.Items.Add(versionParentItem);
contextMenu.Items.Add(scheduleItem);
contextMenu.Items.Add(argumentsItem);
contextMenu.Items.Add(removeItem);

// 绑定到目标控件,右键点击时自动弹出菜单
textBlockSelected.ContextMenu = contextMenu;

// 若需自定义触发逻辑(比如右键按下时显示),可使用以下代码替代上面的赋值
// textBlockSelected.MouseRightButtonDown += (sender, e) =>
// {
//     contextMenu.PlacementTarget = textBlockSelected;
//     contextMenu.IsOpen = true;
//     e.Handled = true;
// };

关键说明:

  • WPF的MenuItem天然支持嵌套:只需将子MenuItem添加到父MenuItem的Items集合中,鼠标悬停时会自动展开子菜单。
  • 无需依赖WinForms控件:WPF原生的ContextMenu和MenuItem完全满足嵌套菜单需求。
  • 事件绑定:所有菜单项(包括子项)都可以绑定Click事件,处理用户的交互逻辑。

内容的提问来源于stack exchange,提问作者Avrigeanu Laurian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:30:33