[英]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文件夾中的特殊資源字典中查找默認樣式。
“您的”控件在“您的”程序集中定義, TextBlock
在PresentationFramework
定義。 因此,您最好創建另一個ResourceDictionary
來重新設計標准控件的樣式,並將其包含/合並到每個xaml文檔中(我想這很痛苦)。
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.