无法覆盖generic.xaml中的默认wpf控件样式

时间:2016-11-15 17:14:02

标签: c# wpf xaml

所以我们试图通过更改generic.xaml中的默认样式来重新尝试一些wpf控件

当我们正常执行此操作时,我们将控件子类化,然后在其静态初始化程序中覆盖子类控件的默认样式键。但是,我们现在试图在不进行子类化的情况下覆盖基本控件。这样,使用股票wpf控件的公司中的任何人都将默认获得我们的新样式。

我似乎无法让这个工作起来。

在我的沙盒应用程序中,这是我们实际问题的一个淡化版本,我有以下内容。

MainWindow.xaml

<StackPanel>
    <TextBlock>It doesn't work</TextBlock>
    <local:CustomTextBlock>It works</local:CustomTextBlock>
</StackPanel>

主题/ Generic.xaml

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="FontSize" Value="100" />
</Style>


<Style TargetType="{x:Type test:CustomTextBlock}">
    <Setter Property="FontSize" Value="100" />
</Style>

CustomTextBlock.cs

public class CustomTextBlock : TextBlock
{
    static CustomTextBlock()
    {
        Type _CustomTextBlock = typeof(CustomTextBlock);
        DefaultStyleKeyProperty.OverrideMetadata(
            _CustomTextBlock,
            new FrameworkPropertyMetadata(_CustomTextBlock));
    }
}

导致显示此内容。

enter image description here

我的理论是WPF引擎忽略了我们的风格,因为默认样式键是 A:not overridden 或B:首先在generic.xaml中找到它们的样式。

我的问题是,有没有解决这个问题?我的假设是否正确?

更新

根据参考源,在这种情况下,TextBlock.cs的stock wpf控件中会覆盖默认样式键

Reference Source TextBlock.cs(第346行)

2 个答案:

答案 0 :(得分:2)

要实现此目的,您可以将样式直接放入App.xaml或单独的ResourceDictionary(名为DefaultStyles.xaml)。

直接放入App.xaml非常简单,只需将样式放在Resources元素中即可。

如果要将样式放入文件中(如果您想要多个应用程序或多个程序集中的样式,这很有用),可以将它添加到App.xaml的MergedDictionaries中

<Application x:Class="MyAwesomeApp"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Themes/DefaultStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

这假定您将文件DefaultStyles放入Themes文件夹中。如果它在另一个组件中,您将执行以下操作:

<ResourceDictionary Source="/Company.Controls.UI;component/DefaultStyles.xaml"/>

答案 1 :(得分:1)

看看this post(Generic.xaml有什么特别之处)。

主要问题似乎是:

  

WPF在与控件相同的程序集中的主题文件夹中的特殊资源字典中查找默认样式。

'您的'控件在'您的'程序集中定义,TextBlockPresentationFramework中定义。因此,您最好创建另一个ResourceDictionary来重新设计标准控件,并在每个xaml文档中包含/合并它(我想,这很痛苦)。

希望它有所帮助。