在Windows Phone 7项目中,我在按钮背景上进行颜色动画,通过范围更改颜色。我希望动画在单击按钮时停止,并使按钮的背景颜色保持在单击按钮时的颜色。为此,我有以下几点:
<Button Height="72" HorizontalAlignment="Left"
Margin="135,48,0,0" Name="button1" VerticalAlignment="Top" Width="160"
Click="button1_Click">
<Button.Resources>
<Storyboard x:Name="colorStoryboard">
<!-- Animate the background color of the canvas from red to green over 4 seconds. -->
<ColorAnimation BeginTime="00:00:00" Storyboard.TargetName="button1"
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
From="Red" To="Blue" Duration="0:0:4" />
</Storyboard>
</Button.Resources>
</Button>
点击事件编码为:
private void button1_Click(object sender, RoutedEventArgs e)
{
colorStoryboard.Pause();
Brush holdBrush = new SolidColorBrush();
holdBrush = button1.Background;
colorStoryboard.Stop();
button1.Background = holdBrush;
}
这就是我认为它会起作用的方式:在storyboard.Pause()之后停止颜色的任何进一步更改(Stop方法使按钮返回到其默认背景颜色),我保存了Background的当前Brush进入新的Brush holdBrush,然后在执行Stop()之后,我尝试使用holdBrush将按钮的background属性恢复为暂停时的值。
然而,这不是正在发生的事情。在上面的代码中我已经确认holdBrush具有按钮在故事板暂停时具有的颜色,但是在Stop发生之后,holdBrush现在具有默认颜色 - 实际上,它具有颜色#FFFFFF,这是按钮的颜色单击时会显示。任何想法,任何人?
答案 0 :(得分:1)
Silverlight for Windows Phone中的动画由Compositor Thread运行,您所做的只是Background对象(浅拷贝)的参考副本,并且该值在UI Thread和Compositor Thread之间共享。要获取颜色的值,您需要获取DependencyProperty的值
private void button1_Click(object sender, RoutedEventArgs e)
{
colorStoryboard.Pause();
var color = button1.Background.GetValue(SolidColorBrush.ColorProperty);
colorStoryboard.Stop();
Dispatcher.BeginInvoke( () => button1.Background.SetValue(SolidColorBrush.ColorProperty,color));
}
但这种方法对Silverlight来说并不是最好的方法。我会重新设置按钮的默认模板(Visual State)。
答案 1 :(得分:0)
您当前的代码只是引用现有对象,然后将其分配回来。如果要在分配到按钮之前检查画笔的颜色,但在停止之后,您会看到它的颜色已重置。那是因为它是按钮所持有的相同的画笔。
请尝试以下方法: -
private void button1_Click(object sender, RoutedEventArgs e)
{
colorStoryboard.Pause();
SolidColorBrush brush = (SolidColorBrush)button1.Background;
Color holdColor = brush.Color;
colorStoryboard.Stop();
brush.Color = holdColor;
}