2010-11-22 63 views
1

在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> 

click事件被编码为:

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方法导致按钮返回到它的默认背景色),我将背景的当前画笔保存到新的画笔holdBrush中,然后在执行Stop()之后,我尝试恢复按钮的背景属性到暂停发生时的值,使用holdBrush。

但是,这不是发生了什么。在上面的代码中,我已经确认holdBrush具有当故事板暂停时按钮具有的颜色,但是在停止发生后,holdBrush现在具有默认颜色 - 实际上,它具有颜色#FFFFFF,该颜色是按钮的颜色点击时会发生。任何想法,任何人?

+0

我想停下来,保持颜色。 – Cyberherbalist 2010-11-22 05:32:57

回答

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)。

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; 
}