【问题标题】:How to inherit/extend styles from a resource dictionary?如何从资源字典继承/扩展样式?
【发布时间】:2011-04-06 21:22:19
【问题描述】:

我无法扩展我在 Windows 字典中定义的样式之一。单独,它似乎按预期将样式应用于我的控件。但是,如果尝试使用 basedOn 属性在我的一个用户控件中扩展样式,它只会覆盖主要样式,并且所有基本样式都会消失。这是一个例子:

在资源字典中,名为 dict1.xaml:

<Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Pink"/>
</Style>  

在主window.xaml中:

<Window.Resources>
    <ResourceDictionary Source="dict1.xaml"/>
</Window.Resources>

在名为 userControl1.xaml 的用户控件中:

<UserControl.Resources>
    <Style  BasedOn="{StaticResource {x:Type Button}}" 
            TargetType="{x:Type Button}">
        <Setter Property="FontWeight" Value="Bold"/>
    </Style>
</UserControl.Resources>

用户控件中的样式只是覆盖资源字典中的样式,字体为粗体。如果我删除用户控件中的样式,字典中的样式就会生效并且背景变成粉红色。我两个都想要。

【问题讨论】:

    标签: .net wpf xaml wpf-controls app.xaml


    【解决方案1】:

    您要么需要将字典添加到 UserControl 资源,要么将其添加到 App.XAML 资源。

    事实上,UserControl 无法解析该 StaticResource - 如果有意义的话,它在 UserControl 的范围内,而不是窗口。

    【讨论】:

    • 是的,这是有道理的。当您说将其添加到 app.xaml 时,会实现什么?将它添加到 Windows.Resources 不是一回事吗?顺便说一句,app.xaml 文件没有在我的设置中使用,因为窗口表单是从 winforms 应用程序打开的,但这是另一个问题。
    • @HAdes 将其添加到 App.XAML 中使其在整个应用程序中都可用,因此您可以从任何地方引用它的资源。
    • 所以看来我所追求的是不可能的,唯一的解决方法是按照您的建议进行操作并将样式复制到用户控件中。我不喜欢这样,因为它不必要地复制样式,并且意味着对样式的任何修改都需要在两者中进行。但我想它现在有效。干杯。
    • @HAdes 可以在资源字典中保留单一样式;您只需要将字典作为资源添加到使用StaticResource 引用其资源的任何 XAML 文件中。我想如果你把它改成DynamicResource,它会像你期望的那样工作(如果包含的窗口有样式,BasedOn 会选择它)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2017-10-19
    • 2018-12-03
    • 2023-03-31
    相关资源
    最近更新 更多