XAML 如何提高WPF中的动画性能?

ffx8fchx  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(134)

我在WPF项目中有以下布局:

我想设置第一行折叠的动画,这样第二行就可以像这样占据整个屏幕:

我通过将第一行的高度设置为“自动”并将大图像的大小设置为0来实现这一点。它的工作正如预期,但它是一个相当波涛汹涌/滞后。尤其是全屏。有什么想法来提高动画的表现?
所有的临时动画都是使用“DoubleAnimation”在代码后面完成的。
我尝试的是:

  • 使用平移变换向上移动整个网格,以减少布局计算。
  • 将“RenderOptions.BitmapScalingMode”设置为“LowQuality”,将“RenderOptions.CachingHint”设置为“Cache”。

尽管如此,没有明显的性能改善。
谢谢

s5a0g9ez

s5a0g9ez1#

关于这个问题,我已经提出了几种解决方案。你可以选择A+B+(C或D)
解决方案A:降低WPF的帧速率你可以将下面的代码添加到app.xaml.cs中的OnStartup()方法或program.cs的main()方法中

Timeline.DesiredFrameRateProperty.OverrideMetadata(
           typeof(Timeline),
           new FrameworkPropertyMetadata { DefaultValue = 30 }
           );

注意这个选项将影响整个wpf应用程序。这意味着所有动画的帧率将被设置为您指定的值。
解决方案B:使用缓动功能。参考:https://learn.microsoft.com/en-us/dotnet/desktop/wpf/graphics-multimedia/easing-functions?view=netframeworkdesktop-4.8
解决方案C:动画渲染变换。缩放变换而不是大图像区域的大小。您可能需要将其与不透明度动画结合使用。
解决方案D:动画的利润,而不是大图像的大小。触发折叠时,您可以为Large-Image-Region指定负的上边距(0,-{selfheight},0,0)。您可能还需要将其与“不透明度”动画结合使用。
在下面的列表框中加载的图像的数量和大小可能会影响动画的性能。

b4wnujal

b4wnujal2#

这很可能是列表控件的大小调整重新呈现的大小不断变化。你可以做的一件事是当折叠顶部区域时,计算列表框的最终大小,然后暂时关闭任何动态大小调整,手动设置列表框高度一次为最终大小(它应该被它的容器剪裁),然后启动调整大小动画,允许列表框的容器调整大小。动画完成后,恢复列表框的动态大小调整。
就像在崩溃的任何踢腿的点击/触发器上一样:

Listbox.Height = Listbox.ActualHeight + collapsedContainerOriginalHeight;

其中,ExposedContainerOriginalHeight是要折叠的行/图像的起始高度。
然后将Completed事件处理程序添加到动画情节提要:

Listbox.Height = double.NaN;

这将防止列表框重新计算它的高度,而只是“滑动”了。不同的行为应该是可见的,因为列表中的任何滚动条都将对齐到新的大小,而不是根据可用区域调整大小。

相关问题