2010-10-29 45 views
0

J'ai un DataTemplate avec un certain nombre d'objets texte et graphiques en couches. L'un d'eux est un effet de lueur qui provient de la propriété RadialGradientBrush Fill d'un rectangle. Au début, j'ai nommé le Rectangle et lié à la propriété Fill et l'ai changé en utilisant un DataTrigger. Cela a bien fonctionné, mais j'ai un certain nombre d'objets RadialGradientBrush dans la section Ressources et comme vous pouvez le voir ci-dessous, c'est beaucoup à répéter quand tout ce que je veux faire est de changer le GradientStops. J'ai donc supprimé la liaison de remplissage et ajouté et nommé un RadialGradientBrush et même si je peux lier à la brosse à partir de ressources, je ne peux pas y accéder dans le DataTrigger. Je reçois l'erreur 'Impossible de trouver la cible de déclenchement'.Puis-je accéder à un dégradé de remplissage nommé dans un datatemplate WPF?

<Rectangle x:Name="Glow" IsHitTestVisible="False" RadiusX="1.5" RadiusY="1.5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" StrokeThickness="0" Opacity="1.0"> 
    <Rectangle.Fill> 
     <RadialGradientBrush x:Name="GlowGradient" Center="0.5,0.848" GradientOrigin="0.5,0.818" RadiusX="-1.424" RadiusY="-0.622" GradientStops="{StaticResource DefaultGradient}"> 
      <RadialGradientBrush.RelativeTransform> 
       <TransformGroup> 
        <ScaleTransform CenterX="0.5" CenterY="0.848" ScaleX="1" ScaleY="1.8"/> 
        <SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.848"/> 
        <RotateTransform Angle="-33.418" CenterX="0.5" CenterY="0.848"/> 
        <TranslateTransform Y="0.278"/> 
       </TransformGroup> 
      </RadialGradientBrush.RelativeTransform> 
     </RadialGradientBrush> 
    </Rectangle.Fill> 
</Rectangle> 

Dans les ressources, j'ai plusieurs objets RadialGradientBrush comme celui-ci.

<RadialGradientBrush x:Key="EscalatedGlow" Center="0.5,0.848" GradientOrigin="0.5,0.818" RadiusX="-1.424" RadiusY="-0.622"> 
    <RadialGradientBrush.RelativeTransform> 
     <TransformGroup> 
      <ScaleTransform CenterX="0.5" CenterY="0.848" ScaleX="1" ScaleY="1.8"/> 
      <SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.848"/> 
      <RotateTransform Angle="-33.418" CenterX="0.5" CenterY="0.848"/> 
      <TranslateTransform Y="0.278"/> 
     </TransformGroup> 
    </RadialGradientBrush.RelativeTransform> 
    <GradientStop Color="Aqua" Offset="0.168"/> 
    <GradientStop Color="#5E1D96FF" Offset="0.474"/> 
    <GradientStop Color="#1101FFFF" Offset="1"/> 
</RadialGradientBrush> 

Je veux les remplacer par moins de code pour chaque changement de couleur, donc je crée des objets GradientStopCollection dans les ressources pour les remplacer par.

<GradientStopCollection x:Key="EscalatedGradient"> 
    <GradientStop Color="Aqua" Offset="0.168"/> 
    <GradientStop Color="#5E1D96FF" Offset="0.474"/> 
    <GradientStop Color="#1101FFFF" Offset="1"/> 
</GradientStopCollection> 

Bien que je puisse se lier aux gradients de ressources, le problème est que je ne peux pas accéder à la brosse GlowGradient changer sa propriété GradientStops. Je pouvais auparavant accéder au rectangle Glow en utilisant un DataTrigger avec ce qui suit. Lorsque j'utilise ce qui suit, j'obtiens l'erreur 'Impossible de trouver la cible de déclenchement'.

<DataTrigger Binding="{Binding Path=Status}" Value="Escalated"> 
     <Setter TargetName="GlowGradient" Property="GradientStops" Value="{StaticResource EscalatedGradient}"/> 
</DataTrigger> 

Je pense que il doit y avoir un moyen de me sauver de reproduire l'ensemble RadialGraientBrush chaque fois que je veux changer les couleurs. Est-il possible d'accéder à la brosse Rectangle Fill à partir du DataTrigger? Des conseils quelqu'un? Merci d'avance.

Répondre

1

En fin de compte, je suis allé avec le code suivant:

<Rectangle Name="Glow" IsHitTestVisible="False" RadiusX="2.5" RadiusY="2.5" 
Fill="{StaticResource OrangeGlow}" /> 

<Storyboard x:Key="GlowColourStoryboard" TargetName="Glow" Duration="0:0:1.5" 
AutoReverse="True" BeginTime="0:0:0" RepeatBehavior="Forever"> 
    <ColorAnimation Storyboard.TargetProperty="Fill.GradientStops[0].Color" 
To="{StaticResource RedGradient.Colour1}" /> 
    <ColorAnimation Storyboard.TargetProperty="Fill.GradientStops[1].Color" 
To="{StaticResource RedGradient.Colour2}" /> 
    <ColorAnimation Storyboard.TargetProperty="Fill.GradientStops[2].Color" 
To="{StaticResource RedGradient.Colour3}" /> 
</Storyboard> 

Je ne l'ai pas montré les Brush ressources parce que ... eh bien, vous pouvez faire votre propre. Ce Storyboard est utilisé de la manière suivante et fonctionne selon les besoins:

<DataTrigger.EnterActions> 
    <BeginStoryboard Storyboard="{StaticResource GlowColourStoryboard}" /> 
</DataTrigger.EnterActions>