Могу ли я получить доступ к названному градиенту заполнения в DataTemplate WPF?
-
27-09-2019 - |
Вопрос
У меня есть DataTemplate с несколькими слоистыми текстовыми и графическими объектами. Один из них - это эффект свечения, который поступает от радиальнойградиентного осколки свойства прямоугольника. Сначала я назвал прямоугольник и связанный с свойством заполнения и изменил его с помощью DataTatrigger. Это работало нормально, но у меня есть несколько радиалградиентных предметов в разделе ресурсов, и, как вы можете видеть ниже, это многое повторить, когда все, что я хочу сделать, это изменить градиентные площадки. Поэтому я снял привязку наполнителя и добавлял и назвал радиалградиентную бром, и хотя я могу связываться с кистью от ресурсов, я не могу получить к нему доступ в DataTrigger. Я получаю сообщение «Не могу найти ошибку триггера».
<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>
В ресурсах у меня есть несколько радиалградиентных предметов, таких как этот.
<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>
Я хочу заменить их с меньшим количеством кода для каждого изменения цвета, поэтому я создал некоторые градиентные объекты градиента в ресурсах, чтобы заменить их.
<GradientStopCollection x:Key="EscalatedGradient">
<GradientStop Color="Aqua" Offset="0.168"/>
<GradientStop Color="#5E1D96FF" Offset="0.474"/>
<GradientStop Color="#1101FFFF" Offset="1"/>
</GradientStopCollection>
Хотя я могу связаться с градиентами ресурсов, проблема в том, что я не могу получить доступ к загоревленной щетке, чтобы изменить свой свойство градиента. Я мог бы ранее получить доступ к прямоугольнику Glow, используя DataTatrigger с следующим.
<DataTrigger Binding="{Binding Path=Status}" Value="Escalated">
<Setter TargetName="Glow" Property="Fill" Value="{StaticResource EscalatedGlow}"/>
</DataTrigger>
Когда я использую следующее, я получаю ошибку «Не могу найти Trigger Trade».
<DataTrigger Binding="{Binding Path=Status}" Value="Escalated">
<Setter TargetName="GlowGradient" Property="GradientStops" Value="{StaticResource EscalatedGradient}"/>
</DataTrigger>
Я думаю, что там просто должен быть способ спасти меня от репликации всей радиалгарства каждый раз, когда я хочу изменить цвета. Есть ли способ получить доступ к прямоугольнику наполнить щетку от DATATRIGER? Любые советы всех? Заранее спасибо.
Решение
В конце концов, я пошел со следующим кодом:
<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>
Я не показал Brush
Ресурсы, потому что ... ну вы можете сделать свой собственный. Этот Storyboard
используется следующим образом и работает по мере необходимости:
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource GlowColourStoryboard}" />
</DataTrigger.EnterActions>