我的绘图应用程序允许用户使用双面绘图(如纸张的两面)。按钮允许用户将图纸上下翻转以与背面一起使用,反之亦然。在UI中,正面显示正常,而背面显示半透明,略微模糊的形式(see example)。底层VM有两个名为Children
和ChildrenBack
的集合属性,包含要显示的对象。
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>
IC
和IC2
是我提到的两个ItemsControl
。有一个名为IsFront
的属性决定了Front或Back是否正面朝上。设置此属性会自动更新Children
和ChildrenBack
个收藏集。
现在问题是:我需要先运行第一个StoryBoard
(将ItemsControl
s缩放为0),然后才能更新Children
和{ {1}}集合,以便内容看起来正在翻转。当第一个故事板完成后,我需要更新两个集合,然后开始第二个动画。
这里的问题是故事板是异步播放的。如果我在VM中设置IsFront属性并在更改后在UI中启动第一个故事板,则故事板不会阻止我的VM代码,直到动画完成。相反,动画会在该VM更新ChildrenBack
和Children
集合后立即启动,这会影响整个节目。
我也尝试使用第一个ChildrenBack
的{{1}}事件。在这种情况下的问题是,View层没有(也不应该)拥有VM的任何引用,要求它更新Completed
和StoryBoard
集合。
在更改Children
之后但在更改ChildrenBack
和Thread.Sleep()
之前,我尝试在VM中执行IsFront
,持续第一个动画的持续时间。这实际上也会暂停动画。我的想法是动画将在不同的线程上运行,但它看起来不像那样。
那么我的出路是什么?