我对ColorAnimation有一个非常奇怪的问题。我想做的很简单(我认为):我有一个带有GradientBrush作为背景的矩形。此矩形具有不同的VisualStates,可更改渐变的颜色。我想为状态之间的过渡添加动画。我的问题是,当我改变状态时,动画不会以当前颜色开始,而是使用默认颜色。
以下代码段可以帮助您重现这一点:
<Window x:Class="TestColorAnimation.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Rectangle Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" x:Name="rect">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="OrangeState">
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Color"
Storyboard.TargetName="stop1"
To="Orange" />
</Storyboard>
</VisualState>
<VisualState x:Name="RedState">
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Color"
Storyboard.TargetName="stop1"
To="Red" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop x:Name="stop1" Color="LightGray" Offset="0" />
<GradientStop x:Name="stop2" Color="LightGray" Offset="1" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Button Grid.Row="1" Grid.Column="0" Content="Go to orange"
x:Name="orangeButton" Click="orangeButton_Click" />
<Button Grid.Row="1" Grid.Column="1" Content="Go to red"
x:Name="redButton" Click="redButton_Click" />
</Grid>
</Window>
事件处理程序只是调用状态更改:
private void orangeButton_Click(object sender, RoutedEventArgs e)
{
VisualStateManager.GoToElementState(this.rect, "OrangeState", true);
}
private void redButton_Click(object sender, RoutedEventArgs e)
{
VisualStateManager.GoToElementState(this.rect, "RedState", true);
}
在这种情况下,如果我进入橙色状态,动画会从灰色变为橙色。但是,当我进入红色状态时,动画从灰色变为红色。我希望(并且期望)它从橙色变为红色。
我尝试使用SolidColorBrush
代替LinearGradientBrush
,并且按预期进行转换。我还尝试使用VisualStates
之外的故事板(但使用LinearGradientBrush
),它也可以按预期工作。我复制此问题的唯一情况是示例中的一个:LinearGradientBrush
中的ColorAnimation
和VisualState
。
我做错了吗?我想要的是什么?
答案 0 :(得分:1)
如果直接将目标更改为GradientStop Color,则可以使用LinearGradients设置动画:
<VisualState x:Name="OrangeState">
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty = "(Rectangle.Fill).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"
Storyboard.TargetName="rect"
To="Orange" />
</Storyboard>
</VisualState>
<VisualState x:Name="RedState">
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty = "(Rectangle.Fill).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"
Storyboard.TargetName="rect"
To="Red" />
</Storyboard>
</VisualState>