【问题标题】:Change Button.Content through style programmatically以编程方式通过样式更改 Button.Content
【发布时间】:2010-05-17 17:47:42
【问题描述】:

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

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

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 书中找到了示例。

有什么想法吗?

【问题讨论】:

    标签: wpf button styles


    【解决方案1】:

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

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

    ... 弄清楚。我更喜欢为此使用 WPF snoop。

    【讨论】:

    • 你是对的。在设置样式之前,内容是在其他地方设置的。我只是不明白为什么我不能通过应用样式来改变价值。
    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2017-12-14
      • 2010-09-11
      • 2019-04-11
      相关资源
      最近更新 更多