2013-01-07 78 views
0

假設我在應用程序級別定義了TextBlock的樣式,並且還在使用某些TextBlocks的應用程序級別上爲'DataClass'定義了DataTemplate。現在,在應用程序的某個子部分中,我想重新定義TextBlock的外觀,我可以重新定義TextBlock的樣式。重新定義數據模式樣式

這裏的問題是:如果DataTemplate應用於應用程序的這個子部分,那麼所有內部的TextBlocks仍將使用應用程序級別的TextBlock樣式(而不是我的重新定義的版本)。有誰知道如何重新定義DataTemplate的風格?

回答

0

<Application.Resources>中的樣式適用於整個應用程序,並且不總是遵循默認樣式查找規則。

通常情況下,如果您不想要這種行爲,請將樣式放在<Window.Resources>之內,以便它們僅適用於窗口內的對象,並使用普通樣式查找規則。

默認情況下,風格不要讓整個控制/模板邊界應用,除了的樣式,從Control繼承的對象,這是最默認WPF控件如LabelTextBox

所以,你可以設置任何Control對象的風格對象的.Resources有它適用於所有子對象:從FrameworkElement

<UserControl.Resources> 
    <Style TargetType="{x:Type Label}"> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 
</UserControl.Resources> 

TextBlock繼承,而不是Control,所以風格的TextBlock韓元」不適用於模板邊界。

如果你想保持你的風格Application.Resources,那麼你就必須覆蓋從樣式的屬性進一步下跌的可視化樹創建TextBlock權之前,如

<UserControl x:Class="MyNamespace.MyDataTypeView"... > 
    <UserControl.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Foreground" Value="Black" /> 
     </Style> 
    </UserControl.Resources> 

    <TextBlock Text="Test" /> 
</UserControl> 

然而,這在UserControl風格將不會應用於對象的另一個控件內部,如內部ComboBox

一個TextBlock子控件內部使用的文本ComboBoxItems將應用TextBlock風格從Application.Resources,但不是從<UserControl.Resources>開始,因爲在Application.Resources中定義的TextBlock樣式將跨越控件/模板邊界,而其他任何X.Resources中定義的TextBlock樣式都不會。

在這些特定的情況下,可能需要跟蹤什麼x:Static刷鍵用於設置TextBlock.Text顏色和覆蓋在你的ComboBox.Resources,如

(我可以在這裏錯SystemColors鍵)

<ComboBox.Resources> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> 
</ComboBox.Resources> 
+0

好的謝謝,關於邊界的一些有趣的信息。但正如你所說,在Control中定義的樣式不會跨越D​​ataTemplate邊界,這實際上是我需要的。我想重新定義數據模板中的一個屬性(例如BackGroundColor),以便爲某個Control中的所有孩子定義屬性。從你寫的,我明白這可能不可能? – kodu

+0

@ user1896048控件中定義的樣式不會在控件/模板邊界*之間繼承,除非樣式適用於繼承自Control的對象,而大多數Controls都是這樣做的。例如,'Label'從'Control'繼承,所以樣式將在子標籤中繼承,但是'TextBlock'不會爲其樣式繼承。你也可以創建一個通用的樣式,比如'