同步运行故事板

时间:2015-08-27 08:17:52

标签: c# wpf mvvm storyboard

我的绘图应用程序允许用户使用双面绘图(如纸张的两面)。按钮允许用户将图纸上下翻转以与背面一起使用,反之亦然。在UI中,正面显示正常,而背面显示半透明,略微模糊的形式(see example)。底层VM有两个名为ChildrenChildrenBack的集合属性,包含要显示的对象。

UI图层使用以下设置:

  • 两个ItemsControl个,一个绑定到Children,另一个绑定到ChildrenBack属性。
  • ChildrenBack ItemsControl的“不透明度”设置为0.3,只是略微可见。

以下StoryBoard显示了翻转效果:

<Storyboard x:Key="SB">
  <DoubleAnimation Storyboard.TargetName="IC" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" From="1" To="0" Duration="0:0:1.2" />
  <DoubleAnimation Storyboard.TargetName="ICBack" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" From="-1" To="0" Duration="0:0:1.2" />
</Storyboard>
<Storyboard x:Key="SB2">
  <DoubleAnimation Storyboard.TargetName="IC" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" From="0" To="1" Duration="0:0:1.2" />
  <DoubleAnimation Storyboard.TargetName="ICBack" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" From="0" To="-1" Duration="0:0:1.2" />
</Storyboard>

ICIC2是我提到的两个ItemsControl。有一个名为IsFront的属性决定了Front或Back是否正面朝上。设置此属性会自动更新ChildrenChildrenBack个收藏集。

现在问题是:我需要先运行第一个StoryBoard(将ItemsControl s缩放为0),然后才能更新Children和{ {1}}集合,以便内容看起来正在翻转。当第一个故事板完成后,我需要更新两个集合,然后开始第二个动画。

这里的问题是故事板是异步播放的。如果我在VM中设置IsFront属性并在更改后在UI中启动第一个故事板,则故事板不会阻止我的VM代码,直到动画完成。相反,动画会在该VM更新ChildrenBackChildren集合后立即启动,这会影响整个节目。

我也尝试使用第一个ChildrenBack的{​​{1}}事件。在这种情况下的问题是,View层没有(也不应该)拥有VM的任何引用,要求它更新CompletedStoryBoard集合。

在更改Children之后但在更改ChildrenBackThread.Sleep()之前,我尝试在VM中执行IsFront,持续第一个动画的持续时间。这实际上也会暂停动画。我的想法是动画将在不同的线程上运行,但它看起来不像那样。

那么我的出路是什么?

0 个答案:

没有答案