2013-07-01 61 views
0

我無法讓MVVM View的按鈕前景覆蓋我爲App.xaml中的T​​extBlock設置的默認樣式。WPF無法覆蓋Button conent前景

我有一個TextBlock風格App.xaml中設置前景色爲一個TextBlock以亮灰默認值如下:

--in的App.xaml

<!-- Default TextBlock Style--> 
<Style TargetType="TextBlock"> 
    <Setter Property="Foreground" Value="Gainsboro" /> 
</Style> 

我想前景爲我所有的按鈕與默認的TextBlock不同。我有我的按鈕在我的MVVM的觀點奠定了以下類似:

- 在myView.xaml

<Button Content="Scan" HorizontalAlignment="Left" VerticalAlignment="Bottom" 
     Margin="10,0,0,10" Width="85" Foreground="Black" /> 

可悲的是我的按鈕不尊重我明確設置顏色,它依然使用默認的TextBlock前景色。任何想法如何讓它行爲正確?我甚至嘗試過在按鈕上設置TextBlock.Foreground,但仍然沒有快樂。

順便說一句,有沒有一個最佳做法,設置前景色的應用範圍廣泛?我假設我的方法是可以接受的。

回答

1

這一切都回到DependencyProperty Value Precedence。不幸的是,由於ButtonTextBlockContentPresenter生成,因此它沒有明確設置Foreground屬性。它是繼承的。這是方式倒在列表上。好消息是,你可以通過顯式設置一個TextBlock作爲Content輕鬆地做到這一點:

<Button HorizontalAlignment="Left" VerticalAlignment="Bottom" 
     Margin="9,0,0,9" Width="85"> 
    <TextBlock Foreground="Black" Text="Scan" /> 
</Button> 

對於應用全局Text風格,你有兩個選擇。如果你沒有創建自己的主題,你所做的幾乎是你唯一的選擇。但是,如果要重新設置控件的樣式,則可以使用默認前景添加Setter。將其設置爲默認值WindowStyle也很重要,因此諸如TextBlock之類的值可以繼承該值。

在很多情況下,設置Window.Foreground會給你你想要的大部分。但是,某些Control明確將其Foreground設置爲其默認樣式,因此它們不會繼承前景。

+0

甜,這是伎倆。知道它有一些DP依賴。只是沒有想到。我應該想到這一點。謝謝!!! – KyleLib

+0

哦,至於我的另一個問題,是否在全局資源字典中的板上設置默認字體屬性的標準做法? – KyleLib

+0

@KyleLib我已經更新了答案,爲此提供了一些提示。 –