<Application.Resources>
中的樣式適用於整個應用程序,並且不總是遵循默認樣式查找規則。
通常情況下,如果您不想要這種行爲,請將樣式放在<Window.Resources>
之內,以便它們僅適用於窗口內的對象,並使用普通樣式查找規則。
默認情況下,風格不要讓整個控制/模板邊界應用,除了的樣式,從Control
繼承的對象,這是最默認WPF控件如Label
或TextBox
。
所以,你可以設置任何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>
好的謝謝,關於邊界的一些有趣的信息。但正如你所說,在Control中定義的樣式不會跨越DataTemplate邊界,這實際上是我需要的。我想重新定義數據模板中的一個屬性(例如BackGroundColor),以便爲某個Control中的所有孩子定義屬性。從你寫的,我明白這可能不可能? – kodu
@ user1896048控件中定義的樣式不會在控件/模板邊界*之間繼承,除非樣式適用於繼承自Control的對象,而大多數Controls都是這樣做的。例如,'Label'從'Control'繼承,所以樣式將在子標籤中繼承,但是'TextBlock'不會爲其樣式繼承。你也可以創建一個通用的樣式,比如'