【问题标题】:How to make a WPF style inheritable to derived classes?如何使 WPF 样式可继承到派生类?
【发布时间】:2011-07-21 18:07:30
【问题描述】:

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

如何告诉 WPF 我希望 MyContextMenu 从 ContextMenu 继承默认样式?希望我可以在我的控制范围内执行此操作(通过静态 ctor 元数据覆盖或其他方式?),而不必在任何 xaml 中乱七八糟。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    如果您在应用程序中定义了这样的样式:

    <Style TargetType="{x:Type ContextMenu}" ...
    

    那么这是一个隐式样式,而不是默认样式。默认样式通常位于与控件相同的程序集中或匹配的程序集中(即 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));
    }
    

    【讨论】:

    • 最后一大块代码正是我要找的。谢谢裸体先生!
    • 这是我希望我能投票 11 次这样的答案的情况之一。谢谢。
    • 不错的技巧,所以我们可以从显式继承隐式样式。
    • 像疯了一样用谷歌搜索。 SetResourceReference 救援!!谢谢。
    • 在隐式样式定义中的MyContextMenuStaticResource 的XAML 插入中使用DynamicResource 是否有原因?我在 XAML 插入中都试过了,似乎都可以工作。
    【解决方案2】:

    作为对 CodeNaked 出色建议的补充,我尝试在 MyContextMenu 的 XAML 部分中指定 Style

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

    如果您使用样式名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2021-08-02
      相关资源
      最近更新 更多