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