代码之家  ›  专栏  ›  技术社区  ›  zendar

以编程方式通过样式更改按钮。内容

  •  0
  • zendar  · 技术社区  · 14 年前

    我想通过样式更改以编程方式更改按钮的内容。我创造了一种风格,为 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" />
    

    我可以这样改变按钮的外观,但我不能改变内容。顺便说一句,我在MCTS关于WPF的书中找到了一个例子。

    有什么想法吗?

    2 回复  |  直到 13 年前
        1
  •  3
  •   repka    14 年前

    这个代码对我来说是有效的。你确定你没有改变吗 Content 从其他地方来的?你可以试试

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

    …去弄清楚。我更喜欢用WPF Snoop。

        2
  •  2
  •   zendar    14 年前

    好吧,今天我发现在WPF中设置属性值时有优先顺序。设置属性值的机制有很多种,属性值取决于设置的方式,而不是设置的时间。
    在XAML中或通过代码设置属性值将始终位于样式(以及模板和触发器)设置的值之前。也就是说,当属性值在XAML中或通过代码设置时,它不能被设置样式重写。
    为了能够用较低优先级的机制更改属性值,必须使用 DependencyObject.ClearValue 方法。

    在上面的代码示例中,还有一个方法 Button.Content 属性,因此Style无法再更改它。解决方法是添加 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;