WPF:使用数据模板时,MenuItem图标位置错误

时间:2013-11-13 22:10:51

标签: c# wpf menuitem

我有以下代码:

<Menu>
    <MenuItem ItemsSource="{Binding SomethingMenuItems}" Header="Something"/>
</Menu>

其中MenuItems是SomethingMenuItem类型的对象的集合。

我也有:

<DataTemplate DataType="{x:Type SomethingMenuItem}">
    <MenuItem Header="{Binding OrderTypeName}">
        <MenuItem.Icon>
            <Image Source="{Binding IconName}"/>
        </MenuItem.Icon>
    </MenuItem>
</DataTemplate>

我希望得到(当我对菜单项进行硬编码时会得到类似的内容):

enter image description here

我得到的是:

enter image description here

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您可能希望使用ItemContainerStyle代替DataTemplate。您必须设置数据项容器的样式,而不仅仅是为数据项提供模板。

使用DataTemplate,您基本上将另一个嵌套的MenuItem显示为为菜单 Something 生成的每个MenuItem的内容,并且您的内部MenuItem将图像放在正确的位置。我在这里附上了Snoop的VisualTree供你参考。

Nested MenuItems

下面是数据项容器的样式(在本例中为MenuItem):

<MenuItem ItemsSource="{Binding SomethingMenuItems}" 
          Header="Something">
    <MenuItem.Resources>
        <Image Source="{Binding IconPath}" x:Key="IconImage" x:Shared="False"/>
        <Style TargetType="MenuItem" >
            <Setter Property="Header" Value="{Binding Name}" />
            <Setter Property="Icon" Value="{StaticResource IconImage}" />
        </Style>
    </MenuItem.Resources>
</MenuItem>

当您应用上述样式时,您可以看到没有嵌套的MenuItems,此处添加了图像 No Nested MenuItems

应用上述样式后,菜单的外观如下:

Menu after Container Style

请参阅this MSDN页面,详细了解ItemContainerStyle

答案 1 :(得分:1)

所以,sthotakura的回答让我走上正轨,但是他发布的代码并没有完全奏效,因为风格也适用于父菜单项。

如果其他人遇到类似的问题并且在这个问题上遇到麻烦,这里的代码就是:

<MenuItem ItemsSource="{Binding SomethingMenuItems}" 
          Header="Something">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem" >
            <Style.Resources>
                <Image Source="{Binding IconPath}" x:Key="IconImage" x:Shared="False"/>
            </Style.Resources>
            <Setter Property="Header" Value="{Binding Name}" />
            <Setter Property="Icon" Value="{StaticResource IconImage}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>