【问题标题】:Setting a background property from a storyboard从情节提要设置背景属性
【发布时间】:2010-11-22 16:03:41
【问题描述】:

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

然而,这不是正在发生的事情。在上面的代码中,我已经确认 holdBrush 具有故事板暂停时按钮的颜色,但是在停止发生之后,holdBrush 现在具有默认颜色 - 实际上,它具有颜色 #FFFFFF,即按钮的颜色单击它时会出现。有什么想法吗?

【问题讨论】:

  • 我想停下来按住颜色。

标签: silverlight windows-phone-7


【解决方案1】:

Silverlight for Windows Phone 中的动画由合成器线程运行,您所做的只是背景对象的参考副本(浅拷贝),并且该值在 UI 线程和合成器线程之间共享。要获取颜色的值,您需要获取 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 来说并不是最好的。我会重新设置按钮的默认模板(视觉状态)。

【讨论】:

    【解决方案2】:

    您当前的代码只是获取对现有对象的引用,然后将其分配回去。如果您要检查画笔的颜色之前分配给按钮但之后停止你会看到它的颜色重置。那是因为它与按钮所持有的 相同 画笔。

    试试这个:-

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
        colorStoryboard.Pause(); 
        SolidColorBrush brush = (SolidColorBrush)button1.Background; 
        Color holdColor = brush.Color;
        colorStoryboard.Stop(); 
        brush.Color = holdColor; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 2021-01-26
      • 2015-12-17
      相关资源
      最近更新 更多