我正在使用ContextMenu
。
我在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
定义中更改/添加什么才能使其正常工作?
答案 0 :(得分:5)
您可以将样式移至ContextMenu.Resources
,这会将其隐式应用于不会与Separators
冲突的菜单项。
替代方法可能是删除TargetType
并限定属性,可能会忽略非应用属性。我自己从未这样做过:
<Style>
<Setter Property="MenuItem.Header" Value="{Binding Name}"/>
答案 1 :(得分:1)
对H.B.答案的一个启示。两种方式都适合我。
但是,设置MenuItem.Header属性将导致输出窗口中出现绑定错误,当然您可以忽略它。
所以在我看来,将样式移到ContextMenu.Resources是更好的选择。
对不起,我不能把它写成评论。
答案 2 :(得分:0)
您可能需要使用ItemContainerStyleSelector
。 ContextMenu
和MenuItem
的{{1}}中有多种类型。尽管人们希望WPF仅将其应用于 Separator
并能够为每种目标类型提供多种样式。
我在派生的容器类型上遇到了类似的问题,需要覆盖TargetType
和GetContainerForItemOverride
。