WPF 情节提要已完成事件



我遇到了一个问题,即我无法向已完成事件中的情节提要发出 Stop() 命令。

例如

private void ShowStandbyGrid()
{
StandbyGrid.Visibility = Visibility.Visible;
Storyboard sbFadeIn = this.FindResource("StandbyGridFadeIn") as Storyboard;
sbFadeIn.Completed += (s, a) =>
{
Console.WriteLine("Completed Event Fired");
sbFadeIn.Stop(this);    //<-- This does not cause the storyboard animation to stop
};

sbFadeIn.Begin(this, true);
}

我可以看到事件正在触发,但它似乎不想停止故事板动画。

由于这个问题,每次对UI执行某些操作时,此动画都会连续运行。我相信这是因为动画从未停止过。

我错过了什么吗?

更新 1

下面是情节提要的 xaml

<Storyboard x:Key="StandbyGridFadeIn">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="StandbyGrid">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>

更新 2好的,经过 8+ 小时的测试和尝试,我仍然不知道为什么它不起作用。但是,这里有几个事实(或问题/发现)

  1. 我创建了一个按钮来反向运行情节提要。情节提要按预期执行(与 StandbyGridFadeIn 相反,因此更像是 FadeOut)。但是,在执行后,StandByGridFadeIn会自动再次执行,而无需任何函数调用。完成后,我看到控制台输出触发 2 x "已完成事件触发"。

  2. I 输出 GetCurrentState(this); 在 sbFadeIn.Stop(this);输出显示"填充"。然后我输出 GetCurrentState(this);在 sbFadeIn.Stop(this);之后,输出仍然显示"填充"。

  3. 做了另一个测试,我把sbFadeInStop(这个); 紧跟在sbFadeIn.Begin(this,true)之后;动画已成功停止。

我想专门讨论观察 #2,考虑到当且仅当动画完成时,第一个 GetcurrentState(this) 应该已经输出"已停止",才会触发事件。这是对的吗?

从代码来看 https://stackoverflow.com/a/5645796/903783

您可能需要使用

Dispatcher.Invoke(DispatcherPriority.Normal, 
(Action)delegate() { sbFadeIn.Stop(); });

在最近的 C# 中,您可能只需编写

Dispatcher.Invoke(DispatcherPriority.Normal, 
()=> sbFadeIn.Stop() );

但是,正如其他人在下面评论的那样,这不太可能是问题所在,因为您应该已经在 UI 线程上执行

更新:

上面 Clemens 的评论也是尝试的可能路径,即您可能需要将 FillBehavior 更改为 Stop 而不是默认的 HoldEnd

https://msdn.microsoft.com/en-us/library/system.windows.media.animation.timeline.fillbehavior(v=vs.110).aspx

另一种方法是删除情节提要(例如MyStoryboard.Remove(MyControl)),如下所示:

https://learn.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/how-to-set-a-property-after-animating-it-with-a-storyboard

那里有一个示例,甚至展示了如何使用 BeginAnimation 从特定属性中删除动画并传递空的第二个参数

最新更新