以编程方式通过样式更改Button.Content

时间:2010-05-17 17:47:43

标签: wpf button styles

我想通过样式更改以编程方式更改按钮的内容。我创建了一个样式,为Button.ContentProperty添加了setter,将新样式设置为按钮,但内容未更改。

我知道我可以直接设置按钮内容,但现在我想知道为什么这不起作用:

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" />

我可以通过这种方式更改按钮的外观,但我无法更改内容。顺便说一句,我在WPF的MCTS书中找到了例子。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

此代码适用于我。你确定你没有从其他地方改变Content吗?你可以尝试

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

......搞清楚。我更喜欢使用WPF snoop。

答案 1 :(得分: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;