更改触发器中多个项目颜色的最佳方法

时间:2014-02-11 19:38:48

标签: c# wpf xaml colors

我担心我没有可用于粘贴的代码,但我会对最佳做法提供一些指导。

我目前在Visual Studio 2010,C#,.NET 4.0中的XAML文件中定义了一个多边形。多边形用固定的颜色定义;但是,根据绑定的值,颜色可以使用触发器改变。

// non-working code - trying to avoid
<Polygon ... Fill="Red" />
<Grid.Triggers>
   <Trigger ...>
      <Setter Property="..." Value="Yellow" />
   </Trigger>
   <Trigger ...>
      <Setter Property="..." Value="Green" />
   </Trigger>
   <Trigger ...>
      <Setter Property="..." Value="Blue" />
   </Trigger>
</Grid.Triggers>

现在,我需要将多边形分成几个连在一起看起来像一个完整形状的碎片。我已将多边形分解为两个多边形和一个矩形。

像以前一样更改颜色的最佳方法是什么,我不重复代码?

我不希望触发器将四种不同的枚举值映射到四种不同的颜色,然后对于每种颜色,定义要着色的相同三种形状。

// non-working code - trying to avoid
<Polygon ... Fill="Red" />
<Polygon ... Fill="Red" />
<Rectangle ... Fill="Red" />
<Grid.Triggers>
   <Trigger ...>
      <Setter Property="..." Value="Yellow" />
      <Setter Property="..." Value="Yellow" />
      <Setter Property="..." Value="Yellow" />
   </Trigger>
   <Trigger ...>
      <Setter Property="..." Value="Green" />
      <Setter Property="..." Value="Green" />
      <Setter Property="..." Value="Green" />
   </Trigger>
   <Trigger ...>
      <Setter Property="..." Value="Blue" />
      <Setter Property="..." Value="Blue" />
      <Setter Property="..." Value="Blue" />
   </Trigger>
</Grid.Triggers>

有没有办法可以将颜色定义为静态资源并使用该资源为我的三个形状着色,然后使用触发器切换资源的R / G / B值?

// non-working code - trying to do
<SolidColorBrush x:Key="MyBrush" Color="Red"/>
<Polygon ... Fill="{StaticResource MyBrush}" />
<Polygon ... Fill="{StaticResource MyBrush}" />
<Rectangle ... Fill="{StaticResource MyBrush}" />
<Grid.Triggers>
   <Trigger ...>
      <Setter Property="..." Value="Yellow" />
   </Trigger>
   <Trigger ...>
      <Setter Property="..." Value="Green" />
   </Trigger>
   <Trigger ...>
      <Setter Property="..." Value="Blue" />
   </Trigger>
</Grid.Triggers>

感谢。

1 个答案:

答案 0 :(得分:1)

使用Binding with Converter调用最佳方式,而不是让大量触发器监听不同的状态。 :)

这是代码:

<Window.Resources>
    <local:BelowZeroConverter x:Key="converter"/>
</Window.Resources>

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Value, Converter={StaticResource converter}}" Value="1">
   <Setter Property="Foreground" Value="Black"></Setter>
</DataTrigger>