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

WPF自定义上下文菜单子菜单不显示问题求助

WPF上下文菜单子菜单不显示的解决方案

刚帮你排查了代码,子菜单无法显示的核心问题在于内层用了ItemsControl而非原生Menu控件,加上模板嵌套方式的小问题,导致HierarchicalDataTemplate的层级绑定没生效。咱们一步步来修正:

问题出在哪?

  • ItemsControl只是基础的项容器,不支持菜单的层级展开逻辑,没法识别HierarchicalDataTemplate里的子项绑定
  • 你在HierarchicalDataTemplate里直接嵌套MenuItem,会造成控件层级冲突,反而干扰了原生菜单的子项处理逻辑

修正后的XAML代码

把内层的ItemsControl换成Menu,同时简化模板写法,就能解决问题:

<CollectionViewSource Source="{Binding MenuItemsCollection}" x:Key="MenuSources"/>
<ControlTemplate x:Key="ContextMenu" TargetType="{x:Type ContextMenu}">
    <Border BorderThickness="1" BorderBrush="SteelBlue">
        <ItemsControl ItemsSource="{Binding Source={StaticResource MenuSources}}" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Background="Ivory"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border BorderThickness=".5" BorderBrush="Black">
                        <!-- 替换内层ItemsControl为Menu控件,它天生支持层级菜单 -->
                        <Menu ItemsSource="{Binding}" Background="Ivory">
                            <Menu.ItemTemplate>
                                <!-- 简化模板:不需要手动写MenuItem,Menu会自动生成 -->
                                <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" 
                                                          ItemsSource="{Binding MenuItems}">
                                    <TextBlock Text="{Binding Header}"/>
                                </HierarchicalDataTemplate>
                            </Menu.ItemTemplate>
                        </Menu>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Border>
</ControlTemplate>

关键改动说明

  1. 用Menu替代内层ItemsControl:Menu控件原生支持菜单层级,能正确解析HierarchicalDataTemplate的ItemsSource绑定,自动创建带展开功能的子菜单
  2. 简化HierarchicalDataTemplate:不需要在模板里手动嵌套MenuItem,Menu会为每个数据项自动生成MenuItem,咱们只需要定义菜单项的显示内容(这里用TextBlock展示Header)
  3. 保留原有布局逻辑:外层的ItemsControl和横向StackPanel完全保留,继续实现你需要的两列菜单布局

关于你的C#代码

你的MenuItemViewModel和MenuItemsCollection的数据初始化代码是完全没问题的,结构清晰正确,修正XAML后就能正常显示父菜单和对应的子菜单了。

内容的提问来源于stack exchange,提问作者Jabir E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:37:35