Posso accedere a un gradiente di riempimento con nome in un modello di dati WPF?
-
27-09-2019 - |
Domanda
Ho un DataTemplate con un numero di testo a strati e oggetti grafici.Uno di questi è un effetto bagliore che deriva dalla proprietà RadialGradientBrush Fill di un Rectangle.Inizialmente ho chiamato Rectangle, l'ho associato alla proprietà Fill e l'ho modificato utilizzando un DataTrigger.Ha funzionato bene, ma ho un numero di oggetti RadialGradientBrush nella sezione Risorse e, come puoi vedere di seguito, è molto da ripetere quando tutto ciò che voglio fare è modificare GradientStops.Quindi ho rimosso l'associazione Fill e ho aggiunto e denominato RadialGradientBrush e sebbene possa associarmi al pennello da Risorse, non riesco ad accedervi in DataTrigger.Ricevo l'errore "Impossibile trovare la destinazione del trigger".
<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>
Nelle risorse ho diversi oggetti RadialGradientBrush come questo.
<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>
Voglio sostituirli con meno codice per ogni cambio di colore, quindi ho creato alcuni oggetti GradientStopCollection nelle Risorse con cui sostituirli.
<GradientStopCollection x:Key="EscalatedGradient">
<GradientStop Color="Aqua" Offset="0.168"/>
<GradientStop Color="#5E1D96FF" Offset="0.474"/>
<GradientStop Color="#1101FFFF" Offset="1"/>
</GradientStopCollection>
Anche se posso associarmi ai gradienti Resource, il problema è che non riesco ad accedere al pennello GlowGradient per modificarne la proprietà GradientStops.In precedenza potevo accedere al Glow Rectangle utilizzando un DataTrigger con quanto segue.
<DataTrigger Binding="{Binding Path=Status}" Value="Escalated">
<Setter TargetName="Glow" Property="Fill" Value="{StaticResource EscalatedGlow}"/>
</DataTrigger>
Quando utilizzo quanto segue, ricevo l'errore "Impossibile trovare la destinazione del trigger".
<DataTrigger Binding="{Binding Path=Status}" Value="Escalated">
<Setter TargetName="GlowGradient" Property="GradientStops" Value="{StaticResource EscalatedGradient}"/>
</DataTrigger>
Penso che ci debba essere un modo per salvarmi dalla replica dell'intero RadialGraientBrush ogni volta che voglio cambiare i colori.Esiste un modo per accedere al pennello Rectangle Fill da DataTrigger?Qualcuno ha qualche consiglio?Grazie in anticipo.
Soluzione
Alla fine, ho utilizzato il seguente codice:
<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>
Non ho mostrato il Brush
risorse perché...beh puoi crearne uno tuo.Questo Storyboard
viene utilizzato nel modo seguente e funziona come richiesto:
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource GlowColourStoryboard}" />
</DataTrigger.EnterActions>