UWP动画重置为“从”状态

时间:2019-01-09 16:42:34

标签: c# animation uwp uwp-xaml

我在UWP应用中有一个动画,该动画正在按预期运行(生产Windows应用商店应用),直到Windows Update 1809为止。更改了某些内容,现在动画在完成后立即重置为From值。

示例代码:

动画(旋转):     

<Storyboard x:Key="FlipTest">
    <DoubleAnimation
                        Storyboard.TargetName="TestRotation"
                        Storyboard.TargetProperty="RotationY"
                        From="180"
                        To="10"
                        Duration="0:0:1.40"
                        />
</Storyboard>

动画项目:

    <TextBlock Text="Test" FontSize="18">
        <TextBlock.Projection>
            <PlaneProjection x:Name="TestRotation" RotationY="0" />
        </TextBlock.Projection>
    </TextBlock>

点击按钮开始通话:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Storyboard sb = (Storyboard)Resources["FlipTest"];
    sb.Begin();
}

预期的行为(在Windows 1803上有效): 当您单击按钮时,TextBlock旋转并保持在此状态。

Windows 1809上的行为: 动画结束后,但在调用From事件之前,TextBox重置为Storyboard.Completed(180度)。

有趣的是,如果我输入To="0",它将保持这种状态。如果我放置10、190或360度,它将重置。请注意,它不会重置为原始状态(0度),而是重置为From值(180度)。

我也将Microsoft.NETCore.UniversalWindowsPlatform更新到了最新版本(6.1.9),但没有任何改变。

任何人都可以解释此行为或告诉其解决方法吗?我缺少明显的东西吗?

更新(丑陋的解决方法)

我发现我可以使用以下丑陋的技巧:

    sb.Completed += (s, ee) =>
    {
        TestRotation.RotationY = 0.01; // ugly hack for Windows Build 1809
    };

但是,不仅在代码中看起来很糟糕。在屏幕上,您会看到可怕的闪烁,因为在动画之后,该项目将重置,然后再次设置为正常值。

我还注意到,RotationY在完成动画后仍保持正确的值,尽管在视觉上该项已旋转。您可以在代码中(在完整的动画中)或在Live Property Explorer中看到值为0,而在视觉上将项目旋转​​到180度。

1 个答案:

答案 0 :(得分:2)

我认为这是一个错误,并且与FillBehavior的{​​{1}}相关联。

对于我来说,这一直发生到第一个Windows 10 Build10240。由于某种原因,如果结果为!= 0,则使用Storyboard会将状态重置为FillBehavior.HoldEndFrom值(To结束的值)。

在没有研究开源代码的情况下(这将是最好的IMO),我做了以下工作,这使我想到了这一假设。

从Windows 10的第一版开始一直在Windows构建中验证您现有的代码。测试了StoryboardTo = 10To = 0重置为起始To = 10值。 From重设为原始值。您已经记录了这个。

To = 0值修改为比From值高360度(使用随机值),以便执行完整旋转。此时,它的确停在To值上,也看起来像From值,这只说To保持Storyboard.FillBehavior = FillBehavior.HoldEnd值。我知道它不是From,因为它每次都会重置为Storyboard.FillBehavior = FillBehavior.Stop之前的初始值(这就是Storyboard应该做的)。

我基于所做的各种测试(包括手动编写FillBehavior.Stop)来假设这一点。

假设:

如果StoryboardStoryboard.FillBehavior = FillBehavior.HoldEnd的值不为0,则完成后它将保持Storyboard.To的值。

如果Storyboard.From可以正常工作,并返回到动画之前该值所处的状态。

建议的解决方法:

尽管我看到您可以通过使用Storyboard.FillBehavior = FillBehavior.Stop事件来解决问题,但我还有另一种选择(尽管仍然不愉快),它可能更干净并消除了闪烁。它对我有用。

我将Storyboard.Completed设置为受影响的Timelines,然后将它们设置动画的属性的初始值设置为FillBehavior.Stop的值。

注意:在您的示例中,您的To大于您的DoubleAnimation.Duration。由于Storyboard.Duration永远不会完成,因此这总是会使其重置为该起始值(在这种情况下为From值)。确保您的DoubleAnimation至少与最高孩子Storyboard.Duration一样长,以防止闪烁和不良影响。

我最初以为这是您的问题,但是将Timeline设置为匹配或更好后,您的问题仍然存在。只需知道持续时间的差异可能会导致不良结果,尤其是当您的Storyboard比孩子的Storyboard短时。

Timeline