簡體   English   中英

無法覆蓋generic.xaml中的wpf控件的默認樣式

[英]Unable to override default style of wpf control in generic.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));
    }
}

結果顯示出來了。

在此處輸入圖片說明

我的理論是WPF引擎會忽略我們的樣式,因為默認樣式鍵要么是 A:未覆蓋, 要么是B:首先在他們的generic.xaml中找到其樣式。

我的問題是,是否可以解決此問題? 我的假設正確嗎?

更新:

根據參考資料,在這種情況下,默認樣式鍵在TextBlock.cs的常規wpf控件中被覆蓋

參考源TextBlock.cs (第346行)

為此,可以將樣式直接放入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"/>

看一下這篇文章 (Generic.xaml有何特別之處)。

主要問題似乎是:

WPF 在與控件相同的程序集中的Themes文件夾中的特殊資源字典中查找默認樣式。

“您的”控件在“您的”程序集中定義, TextBlockPresentationFramework定義。 因此,您最好創建另一個ResourceDictionary來重新設計標准控件的樣式,並將其包含/合並到每個xaml文檔中(我想這很痛苦)。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM