有没有办法在WPF中动态更改(并应用)样式?
假设我在XAML中声明了样式:
<Style TargetType="local:MyLine"
x:Key="MyLineStyleKey" x:Name="MyLineStyleName">
<Setter Property="Fill" Value="Pink"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Fill" Value="Blue" />
</Trigger>
</Style.Triggers>
</Style>
片刻之后,我需要更改 Pink
颜色,比如Green
,所有样式为MyLineStyleKey
的行都变为绿色。一条线在发布时为粉红色,选择时为蓝色......现在,我需要更改未选择的属性(粉红色为绿色)...,所以这不仅仅是将其设置为其他颜色,触发器(选择&gt;蓝色) )将不再工作......这可能吗?怎么样?
是否可以绑定到样式中的粉红色,比如说,按钮背景,这将反映当前使用的样式颜色?
编辑:
对于 1 ,我试过了:
Style s = (Style)this.Resources["MyLineStyleKey"];
(s.Setters[0] as Setter).Value = background;
(s.Setters[1] as Setter).Value = background;
但发生了异常:
使用'SetterBase'之后 (密封),不能修改。
答案 0 :(得分:23)
创建画笔作为资源
<SolidColorBrush x:Key="MyFillBrush" Color="Pink" />
并参考你的风格
<Style x:Key="MyShapeStyle" TargetType="Shape">
<Setter Property="Fill" Value="{DynamicResource MyFillBrush}" />
</Style>
...
<!-- Then further down you may use it like this -->
<StackPanel Width="100">
<Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
<Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
<Ellipse Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
<Button Content="Click to change color" Click="Button_Click" Margin="8" />
</StackPanel>
现在要更改使用“MyShapeStyle”样式的所有形状的颜色,您可以从代码隐藏中执行以下操作:
private void Button_Click(object sender, RoutedEventArgs e)
{
Random r = new Random();
this.Resources["MyFillBrush"] = new SolidColorBrush(Color.FromArgb(
0xFF,
(byte)r.Next(255),
(byte)r.Next(255),
(byte)r.Next(255)));
}
使这项工作成功的事实是你在你的风格中使用DynamicResource
作为画笔参考 - 这告诉WPF监视该资源的变化。如果您改用StaticResource
,则不会出现此行为。
答案 1 :(得分:19)
只能在首次使用之前修改样式。来自MSDN:
当另一种风格基于它或第一次应用时,风格会被密封。
相反,您可以根据现有样式创建新样式,并覆盖所需的属性:
Style newStyle = new Style();
newStyle.BasedOn = originalStyle;
newStyle.TargetType = typeof(MyLine);
Brush blue = new SolidColorBrush(Colors.Blue);
newStyle.Setters.Add(new Setter(Shape.FillProperty, blue));
newStyle.Setters.Add(new Setter(Shape.StrokeProperty, blue));