Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同步运行故事板_C#_Wpf_Mvvm_Storyboard - Fatal编程技术网

C# 同步运行故事板

C# 同步运行故事板,c#,wpf,mvvm,storyboard,C#,Wpf,Mvvm,Storyboard,我的绘图应用程序允许用户使用双面绘图(如纸张的两面)。通过按钮,用户可以将图形上下颠倒以使用背面,反之亦然。在UI中,正面显示正常,而背面显示为半透明、略微模糊的形状()。底层VM有两个集合属性,分别名为Children和ChildrenBack,其中包含要显示的对象 UI层使用以下设置: 两个ItemsControls,一个绑定到ChildrenBack属性,另一个绑定到ChildrenBack属性 ChildrenBackItemsControl将其不透明度设置为0.3,以便仅略微可见

我的绘图应用程序允许用户使用双面绘图(如纸张的两面)。通过按钮,用户可以将图形上下颠倒以使用背面,反之亦然。在UI中,正面显示正常,而背面显示为半透明、略微模糊的形状()。底层VM有两个集合属性,分别名为
Children
ChildrenBack
,其中包含要显示的对象

UI层使用以下设置:

  • 两个
    ItemsControl
    s,一个绑定到
    ChildrenBack
    属性,另一个绑定到
    ChildrenBack
    属性
  • ChildrenBack
    ItemsControl将其不透明度设置为0.3,以便仅略微可见
下面的故事板显示了翻转效果:

<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
s。有一个名为
IsFront
的属性,它决定当前正面还是背面朝上。设置此属性会自动更新
Children
ChildrenBack
集合

现在问题来了:我需要在更新
子集合和
子集合之前运行第一个
情节提要
(它将
ItemsControl
s缩放为0),这样内容看起来会翻转。当第一个故事板完成后,我需要更新两个集合,然后开始第二个动画

这里的问题是故事板是异步播放的。如果我在VM中设置IsFront属性,并在该更改后启动UI中的第一个情节提要,则在动画完成之前,情节提要不会阻止VM的代码。取而代之的是,动画开始,然后VM立即更新
ChildrenBack
ChildrenBack
集合,这会破坏整个节目

我也尝试过使用第一个故事板的
Completed
事件。这种情况下的问题是,视图层没有(也不应该)任何VM引用来要求它更新
ChildrenBack
ChildrenBack
集合

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


那么我的出路是什么呢?

如果我正确地阅读了您的场景,我想我曾经遇到过类似的问题。如果内存可用,我的出路是使用调度程序“延迟设置”其他相关属性,给初始动画时间来完成。大多数时候。它们是短跑动画,几秒钟,而不是你的1.2秒。但也许这会给你一些可以使用的东西。@WillemvanRumpt:谢谢你的意见。在我等待答案的时候,我继续做我的实验,最后完全按照你提到的做了。然后回来看到你的评论说,是的,还有其他人和我一样!哈哈。非常感谢您的意见。@WillemvanRumpt:老实说,我不太喜欢这种方法。它目前正在发挥作用,完全满足我的需要,但我的第六感告诉我,应该有更好的方法来实现这一点。我会等上师的话。@WillemvanRumpt:而且,我的实际时间也只有0.1秒,而不是1.2秒。我放慢了动画的速度,只是为了检查当时发生了什么。事实上,应该(应该?)有更好的方法,这就是为什么我评论中的“大部分时间”部分;)它在大约95-99%的情况下有效,考虑到当时的时间限制,这就足够了。但我使用它绝对不是一个快乐的人:)