在WPF中动态更改样式

时间:2010-09-29 12:32:22

标签: 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>
  1. 片刻之后,我需要更改 Pink颜色,比如Green,所有样式为MyLineStyleKey的行都变为绿色。一条线在发布时为粉红色,选择时为蓝色......现在,我需要更改未选择的属性(粉红色为绿色)...,所以这不仅仅是将其设置为其他颜色,触发器(选择&gt;蓝色) )将不再工作......这可能吗?怎么样?

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

  3. 编辑:
    对于 1 ,我试过了:

    Style s = (Style)this.Resources["MyLineStyleKey"];
    
    (s.Setters[0] as Setter).Value = background;
    (s.Setters[1] as Setter).Value = background;
    

    但发生了异常:

      

    使用'SetterBase'之后   (密封),不能修改。

2 个答案:

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