导航到某些页面后性能会下降

本文关键字:性能 导航 | 更新日期: 2023-09-27 18:37:15

我的WinRT应用程序(仅限Windows Phone)遇到了这个奇怪的问题。该应用程序由多个页面组成,它使用动画来显示模仿W10M中汉堡菜单的侧菜单。当应用程序首次启动时,动画和应用程序性能非常好,但在导航到某些页面(例如 3 或 4 个页面)后,应用程序性能变得越来越差。我没有任何在 UI 线程或任何其他线程上后台运行的代码。

我缺少有关 WinRT 中的导航的内容吗?这真的很奇怪,我不知道是什么原因造成的。

导航到某些页面后性能会下降

下面是

影响 XAML 性能的一些注意事项。

  1. 可视化树的深度。可以在两个控件上拖动,但这些控件表示多个嵌套控件 - 如边框、按钮和面板。运行应用并使用实时 XAML 树查看器查看它可以提示控件是否比所需的复杂。此外,在构建 UI 时请记住深度。支持简单控件(如 RelativePanel)和标准的非重新模板控件。

  2. 构造与加载逻辑。对于尚不熟悉 XAML 的开发人员来说,在不适当的位置实现复杂逻辑的情况并不少见。例如,在子类化控件的构造函数中,您可以告诉它获取一些数据或测试一些昂贵的条件。理想情况下,如果您有这种类型的逻辑,您将使用控件的 Loaded 或页面的 OnNavigatedTo,如果有选项,请使用 async

  3. 数据绑定。数据绑定很棒,但它也很昂贵。您可以在页面上的几十个地方使用它,不太可能有所作为,但是如果您开始在任何地方和所有事情上使用它,它可能会非常昂贵。最简单的补救措施是减少页面中的绑定。接下来,可以将绑定从 Mode=OneWay(默认设置)更改为尽可能Mode=OneTime。接下来,您可以尽可能从 {binding} 切换到 {x:bind}。请记住,绑定没有错,它只是昂贵,所以只在适当的时候使用它。

  4. 记录太多。如果您有像列表视图或 GridView 这样的转发器,则一次显示的项目可能太多。这是一件大事,尤其是在负载时。真正的成本很少是获取数据,通常是渲染数据。如果项目数据模板很复杂,则每条记录的可视化树深度可能会乘以数倍。一种方法是在加载时加载更少的记录,然后随着时间的推移显示更多记录。使用 x:Phase 是另一种很好的方法。简化项模板是另一种方法。尽量减少项模板中的数据绑定会有所帮助。但是,您能做的最好的事情就是运行诊断工具并查看导致它的原因。它可能根本不是您的列表视图。

  5. 未使用的视觉状态。开发人员很聪明地使用视觉状态。但是,他们定义的某些状态适用于边缘情况,并且仅在某些情况下显示。这些视图的 XAML 可能永远不会显示,因此它们将其可见性标记为"折叠"。这没关系。但是,如果您再走一步并使用 x:DeferLoadStrategy,则可以防止在启动时进行 XAML 分析和呈现的成本。当视觉状态显示 XAML 时,平台将自动实现它。你是赢家,用户也是赢家。

因此,5个有用的提示可帮助您的页面加载速度更快。

很有可能,你的理由是别的:)

还有一件事

您是否允许从内存中删除页面?在代码隐藏的隐式代码中,是否有可能订阅静态事件或全局事件?也许您需要在OnNavigatedFrom覆盖中取消订阅。由于问题会随着时间的推移而变得更糟,因此听起来可能是内存问题。虽然,这只是一个猜测。这是一个常见的 C# 失误。

祝你好运