2011-01-02 16 views
5

Edit:En la pregunta original hice algunas suposiciones erróneas sobre cómo funcionan los setters, así que lo modifiqué para ser más preciso y útil.¿Hay alguna manera de usar un creador de estilos para las propiedades de las propiedades?

He intentado hacer algunos elementos del menú más interesantes haciendo que los iconos aparezcan medio transparentes si el mouse no está sobre el elemento. Si el mouse entra, el ícono se debe animar para volverse completamente visible. Las animaciones funcionan, Storyboard.TargetProperty permite el acceso directo a la propiedad opacidad del icono:

<Style x:Key="MenuItemMouseOverStyle" TargetType="MenuItem"> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.5"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

Si intento utilizar un regulador para el icono de opacidad inicial del código no se compilará:

<Setter Property="Icon.Opacity" Value="0.5"/> 

Editar: Setters no funcionan de la manera en que traté de usarlos, no se puede acceder a las propiedades de las propiedades (ver respuestas) The Lo único que puede hacer es especificar una clase de destino si el tipo de destino del estilo no se ha establecido, los siguientes estilos deben ser equivalentes:

<Style x:Key="Style1" TargetType="Image"> 
    <Setter Property="Opacity" Value="0.5"/> 
</Style> 
<Style x:Key="Style2"> 
    <Setter Property="Image.Opacity" Value="0.5"/> 
</Style> 

Así que mi pregunta es si hay una manera de hacer que esto funcione de alguna manera con un colocador.

(Mi solución alternativa actual es un guión gráfico de un solo fotograma clave que se activa con el evento Loaded que funciona bastante bien)

Respuesta

1

no creo que se puede acceder a una propiedad de una propiedad de esa manera por lo que la colada en sí mismo no es el problema. Incluso si Icon fuera de Type Image, eso no funcionaría. Puedes probar con Backgrounds Opacity para una grilla, por ejemplo. El fondo es una propiedad de dependencia de la rejilla y la opacidad es una propiedad de dependencia para el cepillo, pero la siguiente línea no funcionará

<Grid Background.Opacity="0.8"/> 

Usted obtendrá un error que dice

'opacidad' La propiedad fue acoplable no encontrado en el tipo 'Antecedentes'.

Usted tendría que configurar esto en el fondo de sí mismo como esto

<Grid> 
    <Grid.Background> 
     <SolidColorBrush Opacity="0.8"/> 
    </Grid.Background> 
</Grid> 

Así que lo que esto significa que cuando se hace algo como esto

<Grid TextBlock.Foreground="Red"> 
    <TextBlock Text="Test"/> 
</Grid> 

en realidad se está utilizando el Adjunto Propiedad en primer plano para TextBlock.

imagen no tiene una propiedad asociada llamada opacidad por lo que no puede hacer esto ya sea

<MenuItem Image.Opacity="0.8" /> 

Otra solución además de la que ya se está haciendo es utilizar algo como esto (de más arriba Menultem o donde quieras usarlo).

<MenuItem x:Name="topMenuItem" 
      ...> 
    <MenuItem.Resources> 
     <Style TargetType="Image"> 
      <Setter Property="Opacity" Value="0.5"/> 
     </Style> 
    </MenuItem.Resources> 
    <!-- ... --> 
</MenuItem> 
+0

Su solución propuesta funciona, pero es incluso más molesta que la única solución de fotograma clave porque el colocador debe tener la misma definición de estilo, ya que pertenece a las animaciones. Bueno, no esperaba ninguna buena solución porque todo el establecimiento y el negocio de los activadores son un poco restrictivos (por ejemplo, EventTriggers solo funciona con guiones gráficos y no simples configuradores) Gracias de todos modos. –

+0

@HB: Sí, estoy de acuerdo, la solución que ya está utilizando es mejor, así que solo continúe usándola :) Si Recursos fuera un DP, podría haber agregado eso a su Estilo de Menú, pero como no es eso, vaya –

+0

No lo hago entiendo bastante bien lo que quiere decir, ¿por qué los recursos deben ser un DP? Incrustar el estilo de imagen en el Estilo. Los recursos parecen funcionar ... –

1

Así que después de leer la respuesta de Meleak y descubrir que puede tener un estilo dentro de un estilo a través de los recursos lo que probablemente más se acerca a hacer esto con un colocador es un estilo incorporado para acceder a la opacidad del icono. Aquí supongo que el icono para ser una imagen, así que usar eso como el tipo de destino, el estilo completo, por lo tanto se parece a esto:

<Style x:Key="MenuItemMouseOverStyle" TargetType="MenuItem"> 
    <Style.Resources> 
     <Style TargetType="Image"> 
      <Setter Property="Opacity" Value="0.5"/> 
     </Style> 
    </Style.Resources> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.5"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

El único problema con esto es que en realidad no establece la Icon.Opacity pero la opacidad de todas las imágenes que pueden ocurrir dentro de MenuItem.

+0

+1 por Style.Resources en un estilo :) –

Cuestiones relacionadas