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

问题描述:

我在大画布上写了一个小多边形。当鼠标移过画布时,我想突出显示一个多边形。代码是这样的:使用样式触发器来设置嵌套对象的属性

<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没有看到“多边形”。

不能使用Setters这样的,如果你使用这种符号的引擎将寻找一个附加属性,如果没有Style.TargetType被定为在点之前的类型的属性。

最容易做的事情可能是将样式应用到多边形本身,并使用绑定到CanvasDataTrigger,以便触发其属性。

<Polygon Points="11,1 16,6 16,16 11,21" Name="polygon"> 
     <Polygon.Fill> 
      <SolidColorBrush Color="#EEEEEE"/> 
     </Polygon.Fill> 
     <Polygon.Style> 
      <Style TargetType="{x:Type Polygon}"> 
      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding Path=IsMouseOver, 
            RelativeSource={RelativeSource 
            AncestorType={x:Type Canvas}}}" 
        Value="True"> 
        <Setter Property="Stroke" Value="Red"/> 
       </DataTrigger> 
      </Style.Triggers> 
      </Style> 
     <Polygon.Style> 
    </Polygon> 
+0

它的工作原理,但只有当鼠标悬停在多边形上时,才会在画布的其余部分。 :( – Badiboy

+0

@Badiboy:那么,正如在另一个答案指出,你需要在画布上设置背景,否则没有命中测试。 –

+0

@AngelWPF:如果我不添加代码是故意的大部分时间,它可能导致人们复制粘贴而不是理解概念,例如你的代码在绑定中使用'RelativeSource',而有其他方式,所以即使代码没有被复制,某种方法也正在被强化, –

它正在寻找名为“多边形”的Canvas属性,该属性又有一个名为“Stroke”的属性。如果您希望setter将目标设定为不同的对象,则需要使用TargetName。

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

我试过了。但“不能在样式设置器上设置TargetName属性。” – Badiboy

+3

鸡蛋在脸上。我总是忘记那个小小的限制。 –

尝试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> 
+0

你可以用普通的触发器('Trigger.EnterActions'和'Trigger.ExitActions')做同样的事情,重点是这是一个动作不同的动画。此外,您的示例不再在画布上触发,而是在多边形本身上触发。 –

+0

对于EnterActions/ExitActions,您需要一个属性IsMouseOver,它是IInputInterface的一部分。但Canvas和Polygon都没有实现。 –

+0

画布是透明的,因此路由事件MouseEnter/MouseLeave不会触发。你需要为它指定一些背景,至少几乎是透明的。 –