WPF MenuItem的样式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF MenuItem的样式相关的知识,希望对你有一定的参考价值。

这里的空白怎么去掉呢??

图标 + 操作名称 + 快捷键

InputGestureText="Ctrl+S"

参考技术A 这是Menulitem的背景色,在属性里设置也不可以。只能重写Menuitem的模板,把里面的背景色去掉,这样才可以。追问

参考技术B 用blend直接打开 MenuItem的模板修改比较直观,估计是选中的内容控件居左靠齐而没有平铺造成的。可以通过修改背景色并去除边框获得新的效果。

WPF ContextMenu:MenuItem 图标可见性绑定错误

【中文标题】WPF ContextMenu:MenuItem 图标可见性绑定错误【英文标题】:WPF ContextMenu: MenuItem Icon visibility binding error 【发布时间】:2017-07-23 15:54:14 【问题描述】:

这是我的 ContextMenu 的样式:

<Style x:Key="DIOStyle" TargetType="ContentControl">
        <Setter Property="Tag" Value="Binding Content,RelativeSource=RelativeSource Mode=Self"/>
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    <MenuItem Style="StaticResource DeleteMenuItemStyle"/>
                    <!--<MenuItem Header="Normality">
                        <MenuItem Style="StaticResource NcMenuItemStyle"/>
                        <MenuItem Style="StaticResource NaMenuItemStyle"/>
                    </MenuItem>-->
                    <MenuItem Style="StaticResource BothContactsMenuItemStyle"/>
                </ContextMenu>
            </Setter.Value>
        </Setter>
...

这是我的 MenuItem 的样式:

<Style x:Key="BothContactsMenuItemStyle" TargetType="MenuItem">
        <Setter Property="Header" Value="Both Contacts"/>
        <Setter Property="Command" Value="Binding PlacementTarget.Tag.BothNaNcChangeCommand,RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu"/>
        <Setter Property="Icon">
            <Setter.Value>
                <Image Style="StaticResource Tick16Style" Visibility="Binding PlacementTarget.Tag.BothNaNc, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu, Converter=StaticResource BoolToVis"/>
            </Setter.Value>
        </Setter>
    </Style>

命令绑定正在工作,而不是图标可见性绑定给我这个错误:

System.Windows.Data 错误:4:找不到绑定源 参考'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ContextMenu',AncestorLevel='1''。 BindingExpression:Path=PlacementTarget.Tag.BothNaNc;数据项=空; 目标元素是'图像'(名称='');目标属性是“可见性” (类型“可见性”)

为什么? 请注意,这是有效的:

<MenuItem Header="TEST" Visibility="Binding PlacementTarget.Tag.BothNaNc, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu, Converter=StaticResource BoolToVis"/>

【问题讨论】:

【参考方案1】:

您可以将Image 元素定义为资源。这应该有效:

<Image x:Key="img" x:Shared="False"
               Style="StaticResource Tick16Style"
               Visibility="Binding PlacementTarget.Tag.BothNaNc, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu,
                            Converter=StaticResource BoolToVis"/>

<Style x:Key="BothContactsMenuItemStyle" TargetType="MenuItem">
    <Setter Property="Header" Value="Both Contacts"/>
    <Setter Property="Command" Value="Binding PlacementTarget.Tag.BothNaNcChangeCommand, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu"/>
    <Setter Property="Icon" Value="StaticResource img" />
</Style>

如果您将Icon 属性设置为您在&lt;Setter.Value&gt; 中定义内联的Image 元素,就像您目前所做的那样,它将从父WindowUserControl 或任何地方继承DataContext Style 已定义。

【讨论】:

以上是关于WPF MenuItem的样式的主要内容,如果未能解决你的问题,请参考以下文章

wpf menuitem 简约显示的 template样式

WPF ContextMenu DataTemplate MenuItem Visibility 问题

WPF ContextMenu:MenuItem 图标可见性绑定错误

[WPF 自定义控件]在MenuItem上使用RadioButton

WPF 在代码中设置 MenuItem.Icon

WPF:设置MenuItem多种不同状态图标