2010-05-17 107 views
0

我想通過樣式更改以編程方式更改按鈕的內容。我創建了一個樣式,爲Button.ContentProperty添加了setter,將新樣式設置爲按鈕,但內容未更改。以編程方式更改Button.Content的樣式

我知道,我可以直接設置按鈕的內容,但現在我想知道爲什麼這不起作用:

Style aStyle = new Style(); 
Setter bSetter = new Setter(); 
bSetter.Property = Button.ContentProperty; 
bSetter.Value = "Some Text"; 
aStyle.Setters.Add(bSetter); 
aButton.Style = aStyle; 

XAML:

<Button x:Name="aButton" Style="{x:Null}" Click="Button_Click" /> 

我可以改變一個按鈕的外觀這樣,但我無法更改內容。順便說一句,我在WPTS的MCTS書中找到了一個例子。

有什麼想法?

回答

2

那麼,今天我發現在WPF中設置屬性值時有優先順序。設置屬性值的機制有很多,屬性值取決於設置方式,而不是設置屬性值。
在XAML中或通過代碼設置屬性值將始終在Style(和模板和觸發器)設置的值之前。也就是說,當在XAML中或通過代碼設置屬性值時,不能通過設置樣式來覆蓋它。
要使用較低優先級的機制更改屬性值,必須使用方法DependencyObject.ClearValue清除值。

在我上面的代碼示例中,有另一種方法在代碼中設置Button.Content屬性,所以樣式無法再更改它。解決方法是添加ClearValue方法:

Style aStyle = new Style(); 
Setter bSetter = new Setter(); 
bSetter.Property = Button.ContentProperty; 
bSetter.Value = "Some Text"; 
aStyle.Setters.Add(bSetter); 
aButton.ClearValue(ContentProperty); // <<-- Added this line to clear button content 
aButton.Style = aStyle; 
2

此代碼適用於我。你確定你沒有改變Content從其他地方?你可以嘗試

var source = DependencyPropertyHelper.GetValueSource(aButton, ContentControl.ContentProperty); 

...弄明白。我更喜歡爲此使用WPF snoop。

+0

你說得對。內容是在設置風格之前在別處設置的。我只是不明白爲什麼我不能通過應用風格來改變價值。 – zendar 2010-05-20 16:36:28