Я пытаюсь создать анимацию для GradientBrush
, которая будет анимировать каждый градиент для бесконечного циклического перебора всех цветов, содержащихся в градиенте.
Из-за сложной природы этой задачи яПринято обрабатывать все в коде, а не в XAML.
К счастью, в моем коде нет ошибок или исключений.
К сожалению, он также абсолютно ничего не делает.
В соответствии с минимальным, полным и проверяемым примером требования:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace MCVE {
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class Program {
private static LinearGradientBrush TestBrush { get; } =
new LinearGradientBrush(
new GradientStopCollection( new[ ]{
new GradientStop( Colors.Black, 0 / 1.0D ),
new GradientStop( Colors.White, 1 / 1.0D )
} ), new Point( 0.0D, 0.0D ), new Point( 1.0D, 1.0D ) );
[STAThread]
public static int Main( ) {
Storyboard board = CreateStoryboard( TestBrush );
Window w = new Window( ){
Background = TestBrush
};
w.Loaded += new RoutedEventHandler(
( S, E ) => board.Begin( w, true ) );
Program program = new Program( );
program.InitializeComponent( );
return program.Run( w );
}
public static Storyboard CreateStoryboard( GradientBrush brush ) {
Storyboard board = new Storyboard( ){
Duration = new Duration( TimeSpan.FromSeconds( 1.0D ) ),
RepeatBehavior = RepeatBehavior.Forever
};
foreach (
var animation
in brush.GradientStops.Select(
GS => _CreateGradientStopAnimation(
GS, brush.GradientStops.SkipWhile( G => G != GS
).Concat( brush.GradientStops.TakeWhile( G => G != GS )
).Concat( new[ ] { GS } ).Select( G => G.Color ) ) ) )
board.Children.Add( animation );
return board;
ColorAnimationUsingKeyFrames _CreateGradientStopAnimation(
GradientStop stop, IEnumerable<Color> colors ) {
ColorAnimationUsingKeyFrames animation =
new ColorAnimationUsingKeyFrames( );
Storyboard.SetTarget( animation, stop );
Storyboard.SetTargetProperty(
animation, new PropertyPath(
GradientStop.ColorProperty ) );
foreach ( var keyFrame in colors.Select(
C => new EasingColorKeyFrame( C ) ) )
animation.KeyFrames.Add( keyFrame );
return animation;
}
}
}
}
Я пытался использовать только ColorAnimationUsingKeyFrames
для каждого градиента в кисти,и это работает, но я бы предпочел использовать Storyboard
(если возможно), чтобы все анимации могли запускаться вместе.
Возможно ли то, что я пытаюсь сделать?Если так, что я делаю не так?
Если нет, что я могу сделать, чтобы выполнить то, что я пытаюсь сделать здесь (запускать много разных анимаций одновременно)?