【问题标题】:WPF ColorAnimation for a Brush property画笔属性的 WPF ColorAnimation
【发布时间】:2011-01-15 23:08:30
【问题描述】:

我想知道是否有人可以帮助我 - 我有一个标签,当在后面的代码中调用方法时,我需要能够在任何 2 种颜色之间交叉淡入淡出。

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

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。

我知道如何创建合适的画笔,但不知道如何在动画中创建。

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

<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 中的动画 - 我想在后面的代码中执行此操作...

有人可以指点我正确的方向吗?

谢谢

【问题讨论】:

    标签: wpf animation converter coloranimation


    【解决方案1】:

    通常的解决方案是不使用转换器,而是为画笔的颜色设置动画。但是,要做到这一点,您需要一个 PropertyPath,这反过来意味着您需要一个故事板:

    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 属性。

    您还可以使用此技术为渐变画笔中的各个渐变停止点设置动画,等等。

    【讨论】:

    • 这真的很优雅——我现在就试试。 Edit 错误:无法为“System.Windows.Media.SolidColorBrush”上的“Color”属性设置动画,因为该对象已被密封或冻结。 [我的代码]: Dim br As SolidColorBrush = DirectCast((PulseLogo.Foreground), SolidColorBrush) PulseLogo.Foreground.BeginAnimation(SolidColorBrush.ColorProperty, F) '感谢您的帮助
    • 对不起,伙计,我搞砸了。我以前只用故事板做过这个,我天真地以为我可以直接把它翻译成一个 BeginAnimation 调用,这是错误的。我已经更新了答案,现在用实际 *gasp* 诚实至善测试的代码——希望这对你更有效。
    • 不用担心 C# - 它们是如此相似,只不过是一种方言 :) 感谢更新的解决方案 - 它完美无瑕。
    • +1;故事板 s = new Storyboard(); -- 缺少大写 S 的括号和时间跨度 :)
    【解决方案2】:
                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 并绑定到它; //玩得开心!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2011-03-18
      • 2016-08-23
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多