2016-11-15 88 views
1

所以我們試圖通過改變其默認樣式在generic.xaml無法覆蓋WPF控件的默認風格在generic.xaml

到retemplate一些股票的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引擎無視我們的風格,因爲默認的樣式鍵或者是 答:不會覆蓋 或B:第一次發現在他們的generic.xaml自己的風格。

我的問題是,有沒有解決這個問題?我的假設是否正確?

UPDATE:

根據參考源,默認樣式關鍵是在股票WPF控件覆蓋了TextBlock.cs在這種情況下

Reference Source TextBlock.cs(346線)

回答

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放入主題文件夾。如果是在另一個裝配中,則需要執行以下操作:

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

請注意,名稱DefaultStyles.xaml可以是任何東西。這只是一個示例名稱 –

1

有一個看看this post(Generic.xaml有什麼特別之處)。

的主要問題似乎是:

WPF查找默認樣式在一個特殊的資源字典在主題在同一程序作爲控制文件夾

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

希望它有幫助。