WPF动画初次运行

4
我有一个简单的WPF应用程序,其中包含一个用户控件,在主窗口上通过一对故事板进行动画处理。我正在使用用户控件的不透明度、ScaleTransform.ScaleX和ScaleTransform.ScaleY来弹出和隐藏它。看起来很酷,但第一次运行时除外。动画设置为需要3/10秒完成,尽管在测试期间我已经增加了这个时间。我尝试在几分之一秒处设置默认值,以查看我正在动画处理的属性的值是否按预期默认值设置。但是没有效果。我甚至在窗口加载时显式调用我的“隐藏”动画,以查看是否可以帮助我设置默认值,但也没有起作用。运行时在第一次触发动画时是否有某些初始化?是否有一种方法可以在显示UI之前显式调用此类初始化?症状是该控件在第一次动画处理的约2/10秒内甚至都不可见。有时候它会更长时间地显示,直到它完全动画处理(不透明度和大小最终值)才会出现。

第一个动画是在什么时候/如何被触发的?另外,根据您所描述的症状,似乎不透明度在缩放转换后以不同的速率发生了变化。 - rmoore
第一个动画是通过鼠标点击来触发的,就像其他所有动画一样。我在后台代码中实现这个功能,这样如果需要的话就可以将事件标记为已处理。透明度在所有其他动画中也正常工作。基本上,第一个动画和其他任何动画之间的代码没有任何区别。我想知道的是,WPF运行时是否优化了某些东西(我的控件默认通过ScaleTransform和Opacity来隐藏),这是我为一些自动内存优化付出的代价。 - Rich
好像WPF运行时会说:“噢,这个控件一开始不可见,因为ScaleTransforms和Opacity都是0,让我们稍后动态加载它”,结果就会在我期望它立即动画显示的时候追赶进度。 - Rich
这不应该是由此引起的。我可以在网格中使用2000个控件并且初始动画从ScaleX,ScaleY,Opacity = 0开始制作类似的样本,而动画中没有任何延迟。 - rmoore
我正在将所有内容设置为默认值并进行调试,以确保在应用程序加载时我要动画化的值处于需要的位置。在调用动画之前,我唯一做的另一件非平凡的事情是设置UserControl的DataContext。UserControl有几个子UserControl(默认继承DataContext),并且有很多绑定操作。这个过程中是否存在大量的初始化开销,可能会导致窗口第一次延迟渲染? - Rich
1个回答

1

看起来你是在动画之前设置了UserControl的DataContext。可能你正在进行绑定操作,这会在动画开始时同时创建可视对象并将它们添加到可视树中。这需要处理,而动画也在争夺资源。避免这种情况的方法是实例化控件(设置DataContext),但将其隐藏,这样可视对象的创建就不需要在动画时执行。(来自我的同事Tim Lee)


好的,你说得完全正确...这也是我的最初猜测。然而,运行时试图过于聪明了。如果我尝试以任何方式将其隐藏(不透明度、负边距、缩放变换、平移变换),它都会做同样的事情。如果我允许它可见,我甚至不需要先设置DataContext...第一个动画就会顺利进行。这就像我需要欺骗运行时认为它是可见的,而实际上它并不是。或者,我需要知道如何显式地告诉它构建可视树。后者感觉不太像hacky。 - Rich
我明白这个帖子已经很古老了,但你是如何解决这个问题的?即使将相应的控件设置为1宽度也没有帮助。我对WPF相对较新,因此在这里没有得到任何隐含的提示。 - Harti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接