用于类型“菜单项”的样式不能应用于类型“分隔符”
本文关键字:分隔符 菜单项 类型 不能 应用于 样式 用于 | 更新日期: 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
有多种类型,包括MenuItem
和Separator
。尽管人们希望 WPF 仅将其应用于TargetType
,并且能够为每个目标类型提供一个多个样式。
我在派生容器类型中遇到了类似的问题,需要覆盖GetContainerForItemOverride
和IsItemItsOwnContainerOverride
。