使用不同的画笔动画颜色属性 [英] Animate color property with different brushes

查看:26
本文介绍了使用不同的画笔动画颜色属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 ControlTemplate.Resources 中有以下内容:

I have the following in a ControlTemplate.Resources:

<ColorAnimation
    Storyboard.TargetName="border"
    Storyboard.TargetProperty="Background.(SolidColorBrush.Color)"
    To="Orange"
    Duration="0:0:0.2" />

如果我想更改为橙色的原始背景是纯色,它就可以正常工作.但是当原始背景是 LinearGradientBrush 时,我也希望有这项工作.在第二种情况下,动画试图徒劳地改变属性,什么也没有发生.

It works all right if the original background that I wanted to change to orange was a solid color. But I'd also want to have this work when the original background is a LinearGradientBrush. In this second case, the animation tries to change the property in vain, nothing happens.

如何指定替换背景的动画,无论之前是什么类型?

How can I specify an animation that replaces the background no matter what type it was earlier?

推荐答案

如果你的 BackgroundLinearGradientBrush,那么你必须为每个 GradientStop 设置动画code> 到您想要的 Color,即在这种情况下为橙色:

If your Background is LinearGradientBrush, then you will have to animate each GradientStop to the Color you want i.e. Orange in this case:

      <Storyboard x:Key="Storyboard1">
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="border">
            <EasingColorKeyFrame KeyTime="0:0:2" Value="Orange"/>
        </ColorAnimationUsingKeyFrames>
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="border">
            <EasingColorKeyFrame KeyTime="0:0:2" Value="Orange"/>
        </ColorAnimationUsingKeyFrames>
    </Storyboard>

但是如果你想Animate 整个Brush 而不管它的类型,那么你将不得不创建你自己的动画.我创建了自己的 BrushAnimation 类来为 Brush 设置动画

But if you want to Animate the whole Brush irrespective of its type then you will have to create your own Animation. I have created my own BrushAnimation class to animate the Brush

    public class BrushAnimation : AnimationTimeline
    {
        static BrushAnimation()
        {
            FromProperty = DependencyProperty.Register("From", typeof(Brush),
                typeof(BrushAnimation),new PropertyMetadata(new SolidColorBrush()));

            ToProperty = DependencyProperty.Register("To", typeof(Brush),
                typeof(BrushAnimation), new PropertyMetadata(new SolidColorBrush()));
        }

        public override Type TargetPropertyType
        {
            get
            {
                return typeof(Brush);
            }
        }

        protected override System.Windows.Freezable CreateInstanceCore()
        {
            return new BrushAnimation();
        }

        public static readonly DependencyProperty FromProperty;
        public Brush From
        {
            get
            {
                return (Brush)GetValue(BrushAnimation.FromProperty);
            }
            set
            {
                SetValue(BrushAnimation.FromProperty, value);
            }
        }

        public static readonly DependencyProperty ToProperty;
        public Brush To
        {
            get
            {
                return (Brush)GetValue(BrushAnimation.ToProperty);
            }
            set
            {
                SetValue(BrushAnimation.ToProperty, value);
            }
        }


        public override object GetCurrentValue(object defaultOriginValue,
            object defaultDestinationValue, AnimationClock animationClock)
        {
            Brush fromVal = ((Brush)GetValue(BrushAnimation.FromProperty));
            Brush toVal = ((Brush)GetValue(BrushAnimation.ToProperty));

            SolidColorBrush solid = toVal as SolidColorBrush;

            if(fromVal is LinearGradientBrush)
            {
                LinearGradientBrush brush = fromVal as LinearGradientBrush;
                LinearGradientBrush newBrush = new LinearGradientBrush();
                foreach(var stop in brush.GradientStops)
                {
                    ColorAnimation animation = new ColorAnimation(stop.Color,solid.Color,this.Duration);
                    Color color = animation.GetCurrentValue(stop.Color, solid.Color, animationClock);
                    newBrush.GradientStops.Add(new GradientStop(color,stop.Offset));
                }

                return newBrush;
            }
            else
            {
                SolidColorBrush brush = fromVal as SolidColorBrush;
                SolidColorBrush newsolid = new SolidColorBrush();
                ColorAnimation solidAnimation = new ColorAnimation(brush.Color, solid.Color, this.Duration);
                newsolid.Color = solidAnimation.GetCurrentValue(brush.Color, solid.Color, animationClock);

                return newsolid;

            }

        }

我正在使用这个动画在我的窗口上为 Canvas.Background 设置动画

and I am using this Animation to animate Canvas.Background on my window

    <Storyboard x:Key="MyStoryBoard" RepeatBehavior="Forever" AutoReverse="True">
        <local:BrushAnimation Storyboard.TargetName="Canvas1"
                        Storyboard.TargetProperty = "(Canvas.Background)" 
                        To="Orange" Duration="0:0:5"/>
    </Storyboard>

并且您可以使用 StaticResource 设置动画的 From 属性或将其设置为代码隐藏中的背景控制,例如:

and you can set From property of animation using the StaticResource or set it to the Background of Control in your codebehind like:

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            ((BrushAnimation) ((Storyboard) Resources["SolidStoryBoard"]).Children[0]).From = Canvas1.Background;
        }
    }

这篇关于使用不同的画笔动画颜色属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆