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

时间:2016-03-04 09:08:24

标签: c# xaml windows-runtime winrt-xaml

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

WinRT中有关于导航的内容我不知道了吗?这真的很奇怪,我不知道是什么导致它。

1 个答案:

答案 0 :(得分:2)

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

  1. 视觉树的深度。您可以拖动两个控件,但这些控件代表几个嵌套控件 - 如边框,按钮和面板。如果控件比您想要的更复杂,运行您的应用程序并使用Live XAML树查看器查看它可以给您一个提示。此外,在构建UI时要牢记深度。支持像RelativePanel这样的简单控件和标准的非重新模板控件。

  2. 构造与加载逻辑。对于不熟悉XAML的开发人员来说,在不适当的地方实现复杂的逻辑并不罕见。例如,您可以在子类控件的构造函数中告诉它获取一些数据或测试一些昂贵的条件。理想情况下,如果您有此类逻辑,则将使用Loaded of a control或OnNavigatedTo of Page,如果您有选项,则使用async

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

  4. 记录太多。如果您有像ListView或GridView这样的转发器,那么您可能一次出现太多项目。这是一个大问题,特别是在负载方面。真正的成本是获取数据很少见,它通常会渲染数据。如果您的商品数据模板很复杂,那么您的可视树深度可能会与每条记录成倍增加。在加载时加载较少的记录然后随着时间的推移显示更多是一种方法。使用x:Phase是另一个很好的方法。简化您的项目模板是另一种方法。最小化项目模板中的数据绑定可能会有所帮助。但是,您可以做的最好的事情是运行诊断工具并查看导致它的原因。它可能根本不是你的ListView。

  5. 未使用的视觉状态。开发人员很聪明地使用视觉状态。但是,他们定义的某些州是边缘案例,仅在某些情况下显示。这些视图的XAML可能永远不会出现,因此它们标记为“崩溃的可见性”。这没关系。但是,如果再多花一步并使用x:DeferLoadingStrategy,您可以防止在启动时进行XAML解析和渲染的成本。当视觉状态显示XAML时,它将自动由平台实现。您是赢家,用户也是。

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

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

    还有一件事

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

    祝你好运