我想通过样式更改以编程方式更改按钮的内容。我创建了一个样式,为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书中找到了例子。
有什么想法吗?
答案 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;