1

假设我有一个很大的 XAML 页面。此页面上有数十个文本框、按钮等,这些控件需要根据各种条件(权限、视图模型状态等)显示/隐藏/修改。设置视觉转换的两种可能方法是:

  1. 使用视觉状态管理器;将状态转换绑定到视图模型中的属性
  2. 将控件属性绑定到它们各自的视图模型属性,在适用的情况下使用转换器(布尔到可见性、字符串到颜色等)

我的问题:纯粹从性能(速度和内存占用)的角度来看,一种或另一种方法明显更好吗?第二种方法,用绑定加载页面,是否容易压低它?或者差异可能可以忽略不计?

4

1 回答 1

1

我没有测试或基准来证明这一点,但如下推理表明视觉状态方法应该更快。

对于绑定场景:

  • 视图中的每个绑定都会触发一个事件处理程序,每次PropertyChanged都会引发。
  • 每次任何视图模型属性更改时,都必须执行这些处理程序中的每一个。
  • 同样,当您更改视图模型属性以更新视图的配置时,必须为您更改的每个属性运行所有处理程序。

视觉状态场景没有这些处理程序需要处理:

  • VisualStateManager 没有处理程序,因此它在不需要时不会消耗任何 CPU(它忽略“PropertyChanged”,或者在最坏的情况下,只有一个侦听器附加到“CurrentState”属性)。
  • 要触发视觉状态,只需要运行附加的 Storyboard —— PropertyChanged 不会被引发(除了可能一次,最多一次,如上所述),因此所有处理程序都不需要运行多次。

使用 Visual State Manager 显然比设置过多的视图到视图模型绑定更能提高性能。


编辑John Gossman 还指出(很久以前)绑定可能很重,并且可能开始在大型应用程序中消耗过多的内存。在链接的文章中,他声称通过用单个静态回调替换所有绑定节省了 100MB。

于 2013-11-02T00:29:01.487 回答