从故事板设置背景属性

时间:2010-11-22 04:33:50

标签: silverlight windows-phone-7

在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,这是按钮的颜色单击时会显示。任何想法,任何人?

2 个答案:

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