WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性

Posted

技术标签:

【中文标题】WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性【英文标题】:WPF ContextMenu and MenuItem Cannot set OverridesDefaultStyle property in the default Style WPF 【发布时间】:2022-01-04 13:45:58 【问题描述】:

我正在尝试使用具有扩展外观配置的组件创建库。 我可以从自定义组件的默认样式继承样式,而不是创建更多样式和模板,并覆盖一些值。

我创建了继承自默认 ContextMenu 和 MenuItem 的 CustomizableContextMenu 和 CustomizableMenuItem 类,并通过额外的构造函数对其进行了扩展。例如 CustomizableContextMenu。

static CustomizableContextMenu()

    DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomizableContextMenu),
        new FrameworkPropertyMetadata(typeof(CustomizableContextMenu)));

样式和模板位于“Themes/Generic.xaml”文件中引用的单独文件中。

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/FluentControls;component/Themes/CustomizableContextMenuStyle.xaml"/>
    <ResourceDictionary Source="pack://application:,,,/FluentControls;component/Themes/CustomizableMenuItemStyle.xaml"/>  
</ResourceDictionary.MergedDictionaries>

<Style BasedOn="StaticResource CustomizableContextMenuStyle" TargetType="x:Type components:CustomizableContextMenu"/>
<Style BasedOn="StaticResource CustomizableMenuItemStyle" TargetType="x:Type components:CustomizableMenuItem"/>

直到我尝试在同一个应用程序中创建样式和模板(不覆盖 DefaultStyleKeyProperty)并在 MainWindow.xaml 中引用样式,一切正常。但是现在(除了Button、TextBox、ComboBox、CheckBox等其他组件)我有问题了。

我正在尝试使用 CustomizableContextMenu 和 CustomizableMenuItem 创建 CustomizableButton(当我使用标准 Button 时会出现同样的问题),但它不起作用。我从 IDE 收到的消息是“无法在默认样式中设置 OverridesDefaultStyle 属性

这是CustomizableContextMenu的实现代码。

<Components:CustomizableButton
    ...
    Content="I have ContextMenu!">

    <Button.ContextMenu>
        <Components:CustomizableContextMenu
            Background="#C0000000"
            BorderBrush="#C00078D7"
            BorderThickness="1"
            Foreground="White">

           <Components:CustomizableMenuItem
               Background="#C0000000"
               BorderBrush="#C00078D7"
               Foreground="White"
               Header="Item Test 1"
               InputGestureText="Ctrl+1"
               Margin="0,1"/>

        </Components:CustomizableContextMenu>
    </Button.ContextMenu>
</Components:CustomizableButton>

有没有可能以简单的方式做到这一点?而且我必须删除DefaultStyleKeyProperty的覆盖,并以传统方式将样式导入MainWindow.xaml并通过在组件定义中设置属性来使用它?

【问题讨论】:

您是否在您的Style 中设置OverridesDefaultStyle 属性? 是的, 所以删除这个setter? 是的,删除这个 setter 会有所帮助 太棒了。我发布了一个答案。 【参考方案1】:

从默认样式中删除以下&lt;Setter&gt;

<Setter Property="OverridesDefaultStyle" Value="True" />

由于themes/generic.xaml中的样式定义的默认样式,它不能覆盖另一个默认样式。

【讨论】:

以上是关于WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性

WPF ContextMenu 文本对齐

在 WPF 中打开 ContextMenu 时保留 DataGrid IsSelectionActive?

WPF ContextMenu DataTemplate MenuItem Visibility 问题

WPF 左键单击弹出菜单 ContextMenu

WPF:将 ContextMenu 绑定到 MVVM 命令