我正在使用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”后,无法修改
我该如何解决这个问题?
答案 0 :(得分:8)
样式只能设置一次(编译后密封),不能用代码更改
所以解决方案是
按代码
创建样式 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]
或
直接更改属性
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>