我可以在WPF Datatemplate中访问命名的填充渐变吗?

时间:2010-10-29 22:33:22

标签: wpf datatemplate datatrigger fill brush

我有一个带有许多分层文本和图形对象的DataTemplate。其中之一是来自Rectangle的RadialGradientBrush Fill属性的发光效果。首先,我命名Rectangle并绑定到Fill属性并使用DataTrigger更改它。这很好用,但是我在参考资料部分有很多RadialGradientBrush对象,正如你在下面看到的那样,当我想要做的就是改变GradientStops时,要重复一遍。所以我删除了Fill绑定并添加并命名了RadialGradientBrush,虽然我可以从Resources绑定到画笔,但我无法在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对象。

<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对象来替换它们。

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

虽然我可以绑定到Resource渐变,但问题是我无法访问GlowGradient画笔来更改其GradientStops属性。我之前可以使用带有以下内容的DataTrigger来访问Glow Rectangle。

<DataTrigger Binding="{Binding Path=Status}" Value="Escalated">
    <Setter TargetName="Glow" Property="Fill" Value="{StaticResource EscalatedGlow}"/>
</DataTrigger>

当我使用以下内容时,出现“无法找到触发器目标”错误。

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

我在想,每次我想要改变颜色时,都必须有办法让我免于复制整个RadialGraientBrush。有没有办法从DataTrigger访问矩形填充画笔?有人提示吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

最后,我使用了以下代码:

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