WPF中针对Brush属性的ColorAnimation

15

我想知道是否有人可以帮助我 - 我有一个标签,在代码后台调用方法时需要能够在任意两种颜色之间进行交叉淡入淡出效果。

到目前为止,我最好的尝试:

Private OldColor as Color = Colors.White
Sub SetPulseColor(ByVal NewColor As Color)
    Dim F As New Animation.ColorAnimation(OldColor, NewColor, New Duration(TimeSpan.Parse("00:00:01")))
    OldColor = NewColor
    F.AutoReverse = False
    PulseLogo.BeginAnimation(Label.ForegroundProperty, F)

End Sub

我的问题是ColorAnimation返回一个Media.Color,而Foreground的属性类型为Brush。

我知道如何创建适当的Brush,但不知道如何在动画中实现它。

从谷歌搜索来看,似乎我需要一个转换器:

<ValueConversion(GetType(SolidColorBrush), GetType(SolidColorBrush))> _
Public Class ColorConverter
    Implements IValueConverter

Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim Color As Color = DirectCast(value, Color)
        Return New SolidColorBrush(Color)
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Return Nothing
    End Function

End Class

但我看到的所有示例都是在XAML中将其绑定到动画中 - 而我想在代码后端完成它...

有人能指点我吗?

谢谢

2个回答

22

通常解决这个问题的方法不是使用转换器,而是动画化笔刷的颜色。 但是,为了做到这一点,您需要一个PropertyPath,这又意味着您需要一个storyboard:

Storyboard s = new Storyboard();
s.Duration = new Duration(new TimeSpan(0, 0, 1));
s.Children.Add(F);

Storyboard.SetTarget(F, PulseLogo);
Storyboard.SetTargetProperty(F, new PropertyPath("Foreground.Color"));

s.Begin();

(抱歉,涉及 C# 语法)

注意在 SetTargetProperty 调用中的属性路径,它通过 Foreground 属性向下遍历并进入生成的画笔的 Color 属性。

您也可以使用此技术来动画渐变刷子中的单个梯度停止等。


这真的很优雅 - 我现在会尝试一下。[编辑] 错误:无法对 'System.Windows.Media.SolidColorBrush' 上的 'Color' 属性进行动画处理,因为该对象已被密封或冻结。 [我的代码]:Dim br As SolidColorBrush = DirectCast((PulseLogo.Foreground), SolidColorBrush) PulseLogo.Foreground.BeginAnimation(SolidColorBrush.ColorProperty, F)感谢任何帮助。 - Basic
抱歉,我搞砸了。我之前只用过storyboards,天真地以为我可以直接将其转换为BeginAnimation调用,但是这是错误的。我已经更新了答案,现在有实际的*惊叹*经过测试的代码 - 希望这对你更有效。 - itowlson
不用担心C# - 它们非常相似,几乎只是方言 :) 感谢提供的更新解决方案 - 它完美地工作。 - Basic
+1;Storyboard s = new Storyboard(); -- 括号缺失和Timespan的S要大写 :) - MartyIX

0
            ColorAnimation colorChangeAnimation = new ColorAnimation();
            colorChangeAnimation.From = VariableColour;
             colorChangeAnimation.To = BaseColour;
            colorChangeAnimation.Duration = timeSpan;

            PropertyPath colorTargetPath = new PropertyPath("(Panel.Background).(SolidColorBrush.Color)");
            Storyboard CellBackgroundChangeStory = new Storyboard();
            Storyboard.SetTarget(colorChangeAnimation, BackGroundCellGrid);
            Storyboard.SetTargetProperty(colorChangeAnimation, colorTargetPath);
            CellBackgroundChangeStory.Children.Add(colorChangeAnimation);
            CellBackgroundChangeStory.Begin();

//VariableColour和BaseColour是Color类的类,timeSpan是TimeSpan类的类,BackGroundCellGrid是Grid类的类;

//在XAML中不需要创建SolidColorBrush并将其绑定; //玩得开心!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接