用于“MenuItem”类型的样式不能应用于“分隔符”类型

时间:2013-09-22 20:16:33

标签: c# wpf contextmenu menuitem separator

我正在使用ContextMenu

的WPF窗口应用程序

我在XAML中的ContextMenu(在Window.Resources中):

<ContextMenu x:Key="menuList" Placement="Bottom" >
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Header" Value="{Binding Name}"/>
            <EventSetter Event="Click" Handler="cm_RefreshChannelNotification"/>
            <Setter Property="IsChecked" Value="{Binding CFiltered}" />
            <Setter Property="IsCheckable" Value="True"/>
            <Setter Property="StaysOpenOnClick" Value="True"/>           
        </Style>
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 

当我尝试将分隔符添加到ContextMenu时收到错误:

  

System.InvalidOperationException未处理     Message =“用于'MenuItem'类型的样式不能应用于'分隔符'类型。

这样我必须添加一个新的分隔符:

ContextMenu cm = this.FindResource("menuList") as ContextMenu;
Separator separator = new Separator();
separator.SnapsToDevicePixels = true;  
cm.Items.Add(separator);

我应该在ContextMenu定义中更改/添加什么才能使其正常工作?

3 个答案:

答案 0 :(得分:5)

您可以将样式移至ContextMenu.Resources,这会将其隐式应用于不会与Separators冲突的菜单项。


替代方法可能是删除TargetType并限定属性,可能会忽略非应用属性。我自己从未这样做过:

<Style>
    <Setter Property="MenuItem.Header" Value="{Binding Name}"/>

答案 1 :(得分:1)

对H.B.答案的一个启示。两种方式都适合我。

但是,设置MenuItem.Header属性将导致输出窗口中出现绑定错误,当然您可以忽略它。              

所以在我看来,将样式移到ContextMenu.Resources是更好的选择。

对不起,我不能把它写成评论。

答案 2 :(得分:0)

您可能需要使用ItemContainerStyleSelectorContextMenuMenuItem的{​​{1}}中有多种类型。尽管人们希望WPF仅将其应用于 Separator 并能够为每种目标类型提供多种样式。

我在派生的容器类型上遇到了类似的问题,需要覆盖TargetTypeGetContainerForItemOverride