在我们的WPF应用中,我们拥有TargetType={x:Type ContextMenu}
的全球风格。我创建了一个派生自ContextMenu的MyContextMenu,但现在默认样式不适用。
如何告诉WPF我希望MyContextMenu从ContextMenu继承默认样式?希望我可以从我的控件本身(通过静态ctor元数据覆盖或其他东西?)中做到这一点,而不必在任何xaml中乱七八糟。
答案 0 :(得分:47)
如果你的应用程序中定义了样式,那么:
<Style TargetType="{x:Type ContextMenu}" ...
那么这是一个隐式Style,而不是默认Style。默认样式通常与控件或匹配程序集(即MyAssembly.Aero.dll)位于同一程序集中。
隐式样式不会自动应用于派生类型,这可能就是您所看到的。
您可以定义第二个样式,如下所示:
<Style x:Key="{x:Type ContextMenu}" TargetType="{x:Type ContextMenu}" ...
<Style TargetType="{x:Type local:MyContextMenu}" BasedOn="{StaticResource {x:Type ContextMenu}}" ...
或者您可以利用控件的Style属性。您可以从XAML
执行以下操作<local:MyContextMenu Style="{DynamicResource {x:Type ContextMenu}}" ...
或者你可以在你的MyContextMenu中这样做:
public MyContextMenu() {
this.SetResourceReference(StyleProperty, typeof(ContextMenu));
}
答案 1 :(得分:0)
为了补充CodeNaked的出色建议,我尝试在Style
的XAML部分中指定MyContextMenu
:
<ContextMenu x:Class=LocalProject.MyContextMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:AdelSoft_WS_FRA_Test.Composants"
mc:Ignorable="d"
Style="{DynamicResource {x:Type ContextMenu}}">
编译器警告我它无法解析资源,但是在运行时它看起来相当有能力。
自然,您也可以使用
Style="{StaticResource ContextMenuStyleName}">
如果使用样式名称。