使用样式触发器设置嵌套对象的属性

时间:2011-11-01 10:54:44

标签: wpf xaml

我在大画布上写了一个小多边形。我想在鼠标在画布上移动时突出显示多边形。代码是这样的:

<UserControl ...>
  <Canvas Name="canvas" Height="22" Width="22">
      <Canvas.Resources>
          <Style TargetType="Canvas">
              <Style.Triggers>
                  <Trigger Property="IsMouseOver" Value="false">
                      <Setter Property="polygon.Stroke" Value="#EEEEEE"/>
                  </Trigger>
                  <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="polygon.Stroke" Value="Aqua"/>
                </Trigger>
              </Style.Triggers>
          </Style>
      </Canvas.Resources>
      <Polygon Points="11,1 16,6 16,16 11,21" Name="polygon">
              <Polygon.Fill>
                  <SolidColorBrush Color="#EEEEEE"/>
              </Polygon.Fill>
      </Polygon>
  </Canvas>
</UserControl>

然而,setter看不到“多边形”。

3 个答案:

答案 0 :(得分:19)

你不能像这样使用Setters,如果你使用这种表示法,引擎将寻找附加属性,或者如果没有为点之前的类型的属性设置Style.TargetType

最简单的方法是将样式应用于多边形本身,并使用绑定到DataTrigger的{​​{1}},以便触发其属性。

Canvas

答案 1 :(得分:1)

尝试EventTrigger,因为您只能在模板或样式中使用其他类型的触发器。我们已经知道Style.Trigger不允许你的场景。所以这里有适合你的例子:

<Canvas Name="canvas" Height="22" Width="22">
    <Polygon Points="11,1 16,6 16,16 11,21" Name="polygon">
        <Polygon.Fill>
            <SolidColorBrush x:Name="brush" Color="#EEEEEE"/>
        </Polygon.Fill>
        <Polygon.Triggers>
            <EventTrigger RoutedEvent="UIElement.MouseEnter">
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetName="brush" Storyboard.TargetProperty="Color">
                        <ColorAnimation From="#EEEEEE" To="Aqua" Duration="00:00:00.01" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="UIElement.MouseLeave">
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetName="brush" Storyboard.TargetProperty="Color">
                        <ColorAnimation From="Aqua" To="#EEEEEE" Duration="00:00:00.01" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Polygon.Triggers>
    </Polygon>
</Canvas>

答案 2 :(得分:-1)

它正在寻找Canvas的一个名为'polygon'的属性,该属性又有一个名为'Stroke'的属性。如果希望setter定位不同的对象,则需要使用TargetName。

<Setter TargetName="polygon" Property="Stroke" Value="#EEEEEE" />