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 Property="OverridesDefaultStyle" Value="True" />
由于themes/generic.xaml
中的样式是定义的默认样式,它不能覆盖另一个默认样式。
【讨论】:
以上是关于WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性的主要内容,如果未能解决你的问题,请参考以下文章
WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性
在 WPF 中打开 ContextMenu 时保留 DataGrid IsSelectionActive?