【问题标题】:change setter value in style更改样式中的设置器值
【发布时间】:2013-12-13 20:51:16
【问题描述】:

我正在使用 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”使用(密封)后,无法修改

我该如何解决这个问题?

【问题讨论】:

  • 您是否在某处使用该样式?显示更多代码。如果我只使用你所拥有的,这是可行的。
  • 感谢您的关注。我更新它。

标签: c# wpf xaml styles


【解决方案1】:

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

所以解决方案是

  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));
    

以后你可以改变它

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

  1. 直接更改属性

    btnCancel.FontSize=30.0;
    

【讨论】:

    【解决方案2】:

    由于您正在做纯 UI 和代码背后,而一些答案建议您使用 MVVM,这确实会使很多事情变得更容易。

    为什么需要操纵样式?它只是为了按钮而你想操纵它的 FontSize 吗?我假设您在更改字体大小的按钮的 Click 事件上执行此操作。

    那就试试这个

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

    【讨论】:

    • 同意,UI 特定(不是数据相关和非业务逻辑相关的问题)在后面的代码中是可以的。
    【解决方案3】:

    你需要创建一个视图模型,类似这样(我使用的是 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多