在WPF中动态更改样式

ser*_*hio 19 wpf styles

有没有办法在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>
Run Code Online (Sandbox Code Playgroud)
  1. 在一个时刻,我需要改变Pink颜色,来,比方说Green,与风格都行MyLineStyleKey成了绿色.一条线在发布时为粉红色,选择时为蓝色......现在,我需要更改未选择的属性(粉红色为绿色)...,所以这不仅仅是将其设置为其他颜色,即触发器(选择>蓝色) )将不再工作......这可能吗?怎么样?

  2. 是否可以样式中的粉红色颜色绑定到Button背景,这将反映当前使用的样式颜色?

编辑:
对于1我想:

Style s = (Style)this.Resources["MyLineStyleKey"];

(s.Setters[0] as Setter).Value = background;
(s.Setters[1] as Setter).Value = background;
Run Code Online (Sandbox Code Playgroud)

但发生了一个例外:

在使用'密封''SetterBase'后,它无法修改.

Isa*_*avo 24

创建画笔作为资源

<SolidColorBrush x:Key="MyFillBrush" Color="Pink" />
Run Code Online (Sandbox Code Playgroud)

并参考你的风格

<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>
Run Code Online (Sandbox Code Playgroud)

现在要更改使用"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)));
}
Run Code Online (Sandbox Code Playgroud)

使这项工作成功的事实是你DynamicResource在你的风格中使用了一个画笔参考 - 这告诉WPF监视该资源的变化.如果您StaticResource改用,则不会出现此行为.


Tho*_*que 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));
Run Code Online (Sandbox Code Playgroud)