改变风格的设定值

时间:2013-12-13 20:51:17

标签: c# wpf xaml styles

我正在使用WPF编程(c#)。我试图在一套风格中改变价值。

我的风格是:

<Style TargetType="Control" x:Key="st">
    <Setter Property="FontFamily" Value="Tahoma"/>
    <Setter Property="FontSize" Value="14"/>
</Style>

我在按钮中使用它:

<Button x:Name="btnCancel" Style="{StaticResource st}" Content="انصراف" Canvas.Left="30" Canvas.Top="18" Width="139" Height="53" FontFamily="2  badr" FlowDirection="LeftToRight" Click="btnCancel_Click_1" />

我尝试做的是这段代码:

Style style = new Style();
style = (Style) Resources["st"];
Setter setter =(Setter) style.Setters[1];
setter.Value = 30;

将字体大小设置为30后出现此错误?

使用(密封)“SetterCollectionBase”后,无法修改

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

样式只能设置一次(编译后密封),不能用代码更改

所以解决方案是

  1. 按代码

    创建样式
        Style st = new Style(typeof(System.Windows.Controls.Control));
        st.Setters.Add(new Setter(Control.FontFamilyProperty, new FontFamily("Tahoma")));
        st.Setters.Add(new Setter(Control.FontSizeProperty, 14.0));
    
  2. 以后你可以改变它

            st.Setters.OfType<Setter>().FirstOrDefault(X => X.Property == Control.FontSizeProperty).Value = 30.0;//safer than Setters[1]
    

    1. 直接更改属性

      btnCancel.FontSize=30.0;
      

答案 1 :(得分:1)

由于您正在使用纯UI并且在代码后面,而一些答案建议您使用MVVM,这将使很多事情变得更容易。

为什么你需要操纵风格?它只是为按钮而你想操纵它的FontSize?我假设您在按钮的Click事件中执行此操作,它会更改fontsize。

试试这个

 private void btnCancel_Click_1(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        if (button != null) button.FontSize = 30;
    }

答案 2 :(得分:0)

你需要创建一个这样的视图模型(我正在使用MVVM Lite类ViewModelBase,你只需要支持属性更改通知的东西):

public class MyViewModel : ViewModelBase
{
    private double _FontSize = 0.0;
    public double FontSize
    {
        get { return this._FontSize; }
        set { this._FontSize = value; RaisePropertyChanged(() => this.FontSize); }
    }
}

然后在窗口中创建一个实例以及一个getter:

public partial class Window1 : Window
{
    public MyViewModel MyViewModel {get; set;}
    public Window1()
    {
        InitializeComponent();
        this.MyViewModel = new MyViewModel { FontSize = 80 };
    }
}

然后最后你需要绑定你的样式以使用视图模型中的值:

<Window.Resources>
    <Style TargetType="Control" x:Key="st">
        <Setter Property="FontFamily" Value="Tahoma"/>
        <Setter Property="FontSize" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}, Path=MyViewModel.FontSize}"/>
    </Style>
</Window.Resources>