3

我有以下内容ControlTemplate.Resources

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

如果我想更改为橙色的原始背景是纯色,它就可以正常工作。但是当原始背景是LinearGradientBrush. 在第二种情况下,动画尝试更改属性是徒劳的,没有任何反应。

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

4

1 回答 1

5

如果你的Backgroundis LinearGradientBrush,那么你将不得不为每个你想要GradientStop的动画,Color即橙色在这种情况下:

      <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 类来为画笔设置动画

    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 设置动画

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

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

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            ((BrushAnimation) ((Storyboard) Resources["SolidStoryBoard"]).Children[0]).From = Canvas1.Background;
        }
    }
于 2013-10-20T18:41:51.700 回答