如何为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
相关产品推荐
相关产品推荐

