【问题标题】:In WPF, how can I do animation until background worker finishes its work?在 WPF 中,如何在后台工作人员完成工作之前制作动画?
【发布时间】:2011-01-29 16:10:36
【问题描述】:

我有一个应用程序,当用户单击开始按钮并需要很长时间时,它会做一些困难的事情。在此期间,我想在标签上做一些动画,例如,将不透明度从 0 更改为 1,反之亦然,并在更改不透明度的同时在几种颜色之间更改前景色。我希望它在后台工作人员完成工作时停止做动画。我怎样才能做到这一点?以及如何从 c# 启动和停止动画?

【问题讨论】:

标签: wpf multithreading animation backgroundworker


【解决方案1】:

您的动画将托管在情节提要中。

  • 要使动画无限期地运行,请将 Storyboard 的 RepeatBehavior 设置为 Forever。
  • 要在启动 BackgroundWorker 时启动动画,请调用 Storyboard.Begin 方法。
  • 要在 BackgroundWorker 完成时停止动画,请在 RunWorkerCompleted 事件处理程序中调用 Storyboard.Stop 方法。

这是一个例子:

<Window.Resources>
  <Storyboard x:Key="sb" Duration="0:0:2" RepeatBehavior="Forever">
    <DoubleAnimation Storyboard.TargetName="l"
                     Storyboard.TargetProperty="Opacity"
                     From="1" To="0" AutoReverse="True" />
    <ColorAnimation Storyboard.TargetName="l"
                    Storyboard.TargetProperty="Foreground.Color"
                    From="HotPink" To="Lime" AutoReverse="True" />
  </Storyboard>
</Window.Resources>

<StackPanel>
  <Label Name="l" FontSize="72">Oh noes!</Label>
  <Button Click="Button_Click">Animate me!</Button>
</StackPanel>

还有 Button_Click 处理程序:

private void Button_Click(object sender, RoutedEventArgs e)
{
  ((Storyboard)(FindResource("sb"))).Begin();
  // and kick off your BackgroundWorker
}

【讨论】:

  • 非常感谢,但您能否在 xaml 中发布一个 sn-p 代码,说明如何使用不透明度和前景色的动画实现情节提要(具有永远的重复行为)?我是 xaml 的新手,抱歉。
  • 添加示例 -- 不是很好的风格,但应该让你开始!
  • 非常感谢,很好的例子。有一件事,我听说可以制作一系列动画,例如,在这种情况下,首先制作不透明动画,然后在完成后启动前景动画。如果我想这样做,我必须在情节提要中进行哪些修改才能在不透明动画结束时(而不是之前或同时)开始前景动画?非常感谢。
  • 我认为最简单的方法是在前景动画上设置一个 BeginTime 以便它在不透明动画结束时开始。虽然不确定,但可能有更优雅的方式。您可能想将此作为一个单独的问题发布(假设尚未被问到):与评论相比,它会得到更多的关注,因此作为自己的问题得到更好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多