2011-11-01 11 views
9

Tengo un pequeño polígono escrito en el lienzo grande. Quiero resaltar un polígono cuando el mouse se mueve sobre el lienzo. El código es el siguiente:Usar el disparador de estilo para establecer la propiedad de un objeto anidado

<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> 

Sin embargo, setter no ve el "polígono".

Respuesta

19

No puede utilizar Setters así, si se utiliza este tipo de notación el motor buscará una propiedad adjunta, o si no hay Style.TargetType fue fijada para una propiedad del tipo antes del punto.

Lo más fácil es aplicar un estilo al propio polígono y usar un DataTrigger que se una al Canvas para que pueda activar sus propiedades.

<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

Funciona, pero solo cuando el mouse está sobre el polígono, no sobre el resto del lienzo. :( – Badiboy

+0

@Badiboy: Bueno, como se señaló en otra respuesta que necesita establecer un fondo en el lienzo de lo contrario no hay una prueba de aciertos. –

+0

@AngelWPF: Si no agrego el código que es deliberado la mayor parte del tiempo, puede hacer que la gente copie y pegue en lugar de entender el concepto. Su código, por ejemplo, usa 'RelativeSource' en el enlace, mientras que habría otras formas, por lo que incluso si el código no se copia, se refuerza cierto método sobre el concepto genérico. . –

-1

Está buscando una propiedad del Canvas llamada 'polygon', que a su vez tiene una propiedad llamada 'Stroke'. Necesita utilizar TargetName si desea que el colocador se dirija a un objeto diferente.

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

Intenté esto. Pero "la propiedad TargetName no se puede establecer en un Organizador de estilo". – Badiboy

+3

Huevo en la cara. Siempre me olvido de esa pequeña restricción. –

1

Trate EventTrigger, ya que otros tipos de factores desencadenantes que podrían utilizar únicamente en las plantillas o estilos. Y ya sabemos que Style.Trigger no permite su escenario. Así que aquí está el ejemplo de trabajo para usted:

<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

Puedes hacer lo mismo con un activador normal ('Trigger.EnterActions' y' Trigger.ExitActions'), el punto es que esta es una animación que funciona de manera diferente . Además, su ejemplo ya no se desencadena en el lienzo, sino en el propio polígono. –

+0

Para EnterActions/ExitActions necesita una propiedad IsMouseOver que sea parte de IInputInterface. Pero ni Canvas ni Polygon tienen su implementación. –

+0

El lienzo es transparente, por lo que los eventos enrutados MouseEnter/MouseLeave no se dispararán. Debe especificar algún fondo para ello, al menos casi transparente. –

Cuestiones relacionadas