2013-07-02 47 views
1

enter image description here我真的很奇怪,爲什麼下面的代碼使顏色或按鈕的含量也橙色WPF當它顯然只對文本塊的目標。當我將目標更改爲按鈕時,它工作正常,僅適用於按鈕內容而不適用於文本塊。爲什麼這種奇怪的行爲?風格在WPF只在文字塊的目標時,也適用同樣的風格,按鈕自動內容

<Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Foreground" Value="orange" /> 
</Style> 
+0

看起來你忘了添加代碼:) – nakiya

+0

@nakiya:沒有:(對不起,我不知道什麼技術是與Stackoverflow是什麼,我沒有添加代碼,它沒有顯示,即使我現在編輯,它顯示在編輯的地方,但現在提交一次。對你來說代碼是: Learner

+0

因爲'Button ''包含一個'TextBlock',你可能希望將你的樣式(或者至少是你的樣式的大多數方面)定位在比TextBlock更高的層次上,比如'Label'。 –

回答

1

基本上大部分WPF Window您看到文本的最終轉化成爲TextBlock。如果指定<Button Content="ABC"/>什麼WPF實際上做的是把<TextBlock Text="ABC"/>Button.Content當其ContentPresenter創建可視化樹。因此,您的隱式樣式不適用於Button,但適用於其內容的一部分TextBlock

在WPF控件的默認模板,該模板是由可從其他控件是建立直到最終每個文本爲TextBlock,這就是爲什麼微軟把保護到位,通常隱含Style在模板只能從繼承元素應用於結束了其他控件構建System.Windows.Controls.Control保護最基本的元素,如TextBlock,這是從System.Windows.FrameworkElement直接繼承,在不知情的應用複雜的風格,可能會導致不必要的行爲,性能問題或錯誤。因此在您指定隱含TextBlock風格Window.Resources,或在其子項之一,它不會自動在模板中應用,你Button將保持默認的顏色,除非你將其移動到Application.Resources那麼它也適用於模板和您的Button文字將變成橙色。

+0

你好,這是非常令人信服的答案,我明白了,非常感謝你用簡單的英語解釋我,我可以現在,如果有人問我這個行爲或問題,我可以解釋一下,正如你所提到的,我會試着將它保存在Windows.Resources中,看看我是否得到了默認的東西,但作爲初學者,我沒有知道該怎麼做,我會讀一些b日誌。再次感謝,我感謝您的非常謙虛的回覆。乾杯 – Learner

+0

DK,有沒有辦法讓我看到每一個控制或類的視覺樹?我是新手,我不知道如何在VS中看到視覺樹,特別是對於這些WPF控件。請在您方便的時候指導我。謝謝 – Learner

+1

@Divine,例如在Click事件上放置一個斷點,在調試器中懸停'sender'變量,然後單擊放大鏡圖標,它會顯示當前的可視化樹。你也可以從即時窗口做到 – dkozl