Como: Animate the Position or Color of a Gradient Stop
Este exemplo mostra como animar a Color e Offset de objetos GradientStop.
Exemplo
O exemplo a seguir anima três paradas de gradiente dentro de um LinearGradientBrush. Este exemplo utiliza três animações, cada qual animando uma parada de gradiente diferente:
A primeira animação, um DoubleAnimation, anima o Offset da primeira parada do gradiente de 0.0 a 1.0 e então de volta a 0.0. Como resultado, a primeira cor do gradiente muda do lado esquerdo para o lado direito do retângulo e de volta para o lado esquerdo.
A segunda animação, um ColorAnimation, anima o Color da primeira parada do gradiente de Purple para Yellow e depois de volta para Purple. Como resultado, a cor do meio do gradiente muda de roxo para amarelo e de volta para roxo.
A terceira animação, uma outra ColorAnimation, anima a opacidade da Color da terceira parada do gradiente de -1 e depois volta. Como resultado, a terceira cor do gradiente esmaece e depois se torna opaca novamente.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace BrushesIntroduction
{
public class GradientStopAnimationExample : Page
{
public GradientStopAnimationExample()
{
Title = "GradientStop Animation Example";
Background = Brushes.White;
// Create a NameScope for the page so that
// Storyboards can be used.
NameScope.SetNameScope(this, new NameScope());
// Create a rectangle. This rectangle will
// be painted with a gradient.
Rectangle aRectangle = new Rectangle();
aRectangle.Width = 200;
aRectangle.Height = 100;
aRectangle.Stroke = Brushes.Black;
aRectangle.StrokeThickness = 1;
// Create a LinearGradientBrush to paint
// the rectangle's fill.
LinearGradientBrush gradientBrush = new LinearGradientBrush();
// Create gradient stops for the brush.
GradientStop stop1 = new GradientStop(Colors.MediumBlue, 0.0);
GradientStop stop2 = new GradientStop(Colors.Purple, 0.5);
GradientStop stop3 = new GradientStop(Colors.Red, 1.0);
// Register a name for each gradient stop with the
// page so that they can be animated by a storyboard.
this.RegisterName("GradientStop1", stop1);
this.RegisterName("GradientStop2", stop2);
this.RegisterName("GradientStop3", stop3);
// Add the stops to the brush.
gradientBrush.GradientStops.Add(stop1);
gradientBrush.GradientStops.Add(stop2);
gradientBrush.GradientStops.Add(stop3);
// Apply the brush to the rectangle.
aRectangle.Fill = gradientBrush;
//
// Animate the first gradient stop's offset from
// 0.0 to 1.0 and then back to 0.0.
//
DoubleAnimation offsetAnimation = new DoubleAnimation();
offsetAnimation.From = 0.0;
offsetAnimation.To = 1.0;
offsetAnimation.Duration = TimeSpan.FromSeconds(1.5);
offsetAnimation.AutoReverse = true;
Storyboard.SetTargetName(offsetAnimation, "GradientStop1");
Storyboard.SetTargetProperty(offsetAnimation,
new PropertyPath(GradientStop.OffsetProperty));
//
// Animate the second gradient stop's color from
// Purple to Yellow and then back to Purple.
//
ColorAnimation gradientStopColorAnimation = new ColorAnimation();
gradientStopColorAnimation.From = Colors.Purple;
gradientStopColorAnimation.To = Colors.Yellow;
gradientStopColorAnimation.Duration = TimeSpan.FromSeconds(1.5);
gradientStopColorAnimation.AutoReverse = true;
Storyboard.SetTargetName(gradientStopColorAnimation, "GradientStop2");
Storyboard.SetTargetProperty(gradientStopColorAnimation,
new PropertyPath(GradientStop.ColorProperty));
// Set the animation to begin after the first animation
// ends.
gradientStopColorAnimation.BeginTime = TimeSpan.FromSeconds(3);
//
// Animate the third gradient stop's color so
// that it becomes transparent.
//
ColorAnimation opacityAnimation = new ColorAnimation();
// Reduces the target color's alpha value by 1,
// making the color transparent.
opacityAnimation.By = Color.FromScRgb(-1.0F, 0F, 0F, 0F);
opacityAnimation.Duration = TimeSpan.FromSeconds(1.5);
opacityAnimation.AutoReverse = true;
Storyboard.SetTargetName(opacityAnimation, "GradientStop3");
Storyboard.SetTargetProperty(opacityAnimation,
new PropertyPath(GradientStop.ColorProperty));
// Set the animation to begin after the first two
// animations have ended.
opacityAnimation.BeginTime = TimeSpan.FromSeconds(6);
// Create a Storyboard to apply the animations.
Storyboard gradientStopAnimationStoryboard = new Storyboard();
gradientStopAnimationStoryboard.Children.Add(offsetAnimation);
gradientStopAnimationStoryboard.Children.Add(gradientStopColorAnimation);
gradientStopAnimationStoryboard.Children.Add(opacityAnimation);
// Begin the storyboard when the left mouse button is
// pressed over the rectangle.
aRectangle.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e)
{
gradientStopAnimationStoryboard.Begin(this);
};
StackPanel mainPanel = new StackPanel();
mainPanel.Margin = new Thickness(10);
mainPanel.Children.Add(aRectangle);
Content = mainPanel;
}
}
}
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="GradientStop Animation Example"
Background="White">
<StackPanel Margin="10">
<Rectangle
Width="200"
Height="100"
Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStop x:Name="GradientStop1" Color="MediumBlue" Offset="0.0" />
<GradientStop x:Name="GradientStop2" Color="Purple" Offset="0.5" />
<GradientStop x:Name="GradientStop3" Color="Red" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseLeftButtonDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="GradientStop1"
Storyboard.TargetProperty="Offset"
From="0.0" To="1.0" Duration="0:0:1.5"
AutoReverse="True" />
<ColorAnimation
Storyboard.TargetName="GradientStop2"
Storyboard.TargetProperty="Color"
From="Purple" To="Yellow"
Duration="0:0:1.5"
AutoReverse="True"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetName="GradientStop3"
Storyboard.TargetProperty="Color"
Duration="0:0:1.5"
AutoReverse="True"
BeginTime="0:0:6">
<ColorAnimation.By>
<Color ScA="-1" ScR="0" ScB="0" ScG="0" />
</ColorAnimation.By>
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</Page>
Embora esse exemplo utilize um LinearGradientBrush, o processo é o mesmo para animar objetos GradientStop dentro de um RadialGradientBrush.
Para exemplos adicionais, veja Exemplo de pincéis.