3

我正在开发使用ContextMenu.

ContextMenu在 XAML 中(在 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”类型的样式不能应用于“Separator”类型。

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

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

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

4

3 回答 3

5

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


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

<Style>
    <Setter Property="MenuItem.Header" Value="{Binding Name}"/>
于 2013-09-22T20:18:58.173 回答
1

您可能需要使用ItemContainerStyleSelector. 您的 和 中都有ContextMenu多种MenuItem类型Separator。尽管人们希望 WPF 将其应用于 TargetType唯一并且能够为每个目标类型提供多种样式。

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

于 2019-06-09T23:07:37.097 回答
1

HB回答的一个补充。两种方式都对我有用。

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

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

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

于 2017-09-19T09:10:19.667 回答