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

sco*_*obi 18 c# wpf xaml

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

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

Cod*_*ked 47

如果您的应用程序中定义了样式,如下所示:

<Style TargetType="{x:Type ContextMenu}" ...
Run Code Online (Sandbox Code Playgroud)

那是一个隐式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}}" ...
Run Code Online (Sandbox Code Playgroud)

或者,您可以利用控件的Style属性.您可以从XAML执行以下操作

<local:MyContextMenu Style="{DynamicResource {x:Type ContextMenu}}" ...
Run Code Online (Sandbox Code Playgroud)

或者您可以在MyContextMenu中执行此操作,如下所示:

public MyContextMenu() {
    this.SetResourceReference(StyleProperty, typeof(ContextMenu));
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我希望能够像11次一样回答问题的情况之一.谢谢. (4认同)
  • 最后一段代码正是我想要的.谢谢Naked先生! (2认同)