用于类型“菜单项”的样式不能应用于类型“分隔符”

本文关键字:分隔符 菜单项 类型 不能 应用于 样式 用于 | 更新日期: 2023-09-27 18:32:25

我正在研究使用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 is unhandling 消息="用于类型'菜单项'的样式不能应用于类型'分隔符'。

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

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

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

用于类型“菜单项”的样式不能应用于类型“分隔符”

您可以将

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


另一种方法是删除TargetType并限定属性,可能会忽略未应用的属性。不过我自己从来没有这样做过:

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

对 H.B. 的回答。这两种方式都对我有用。

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

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

抱歉,我还不能将其写为评论。

您可能需要

使用 ItemContainerStyleSelector 。您的ContextMenu有多种类型,包括MenuItemSeparator。尽管人们希望 WPF 仅将其应用于TargetType,并且能够为每个目标类型提供一个多个样式。

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