如何使WPF样式可继承到派生类?

时间:2011-07-21 18:07:31

标签: c# wpf xaml

在我们的WPF应用中,我们拥有TargetType={x:Type ContextMenu}的全球风格。我创建了一个派生自ContextMenu的MyContextMenu,但现在默认样式不适用。

如何告诉WPF我希望MyContextMenu从ContextMenu继承默认样式?希望我可以从我的控件本身(通过静态ctor元数据覆盖或其他东西?)中做到这一点,而不必在任何xaml中乱七八糟。

2 个答案:

答案 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}">

如果使用样式名称。