加载大量用户控件的性能问题

时间:2011-01-08 20:51:16

标签: .net wpf performance xaml baml

我的应用程序正在将一堆相同的用户控件加载到ScrollPanel中。问题是,这很慢。

分析器显示方法Application.LoadComponent()是我的用户控件的构造函数中的设计器代码内部调用的,是瓶颈。该方法的文档说,此方法加载 XAML 文件。

问题是,我如何使用BAML而不是XAML?我怎样才能实现我的用户控件的XAML在从它创建新实例时不能一次又一次地解析?还有另一种方法可以更快地加载我的用户控件吗?

1 个答案:

答案 0 :(得分:5)

LoadComponent()已加载.baml,请不要担心这个问题。微软故意这样做,不让开发人员依赖baml格式。展望未来,他们可以改进格式而不会破坏任何现有的应用程序。

是的,还有另一种方法可以让它更快地运作。要采取的第一个优化是{{​​3}}。 WPF已经提供了方便的UI virtualization。它与ItemsControls协同工作,并且有一定的局限性(例如,如果您创建项目容器并通过自己的容器添加它们,则会松开虚拟化,或者如果您设置ScrollViewer.CanContentScroll="False",则会再次松开它)。要使用虚拟化,您可能必须重写应用程序以使用ItemsControl + DataBinding样式(ListBox已启用虚拟化)

如果您认为需要有关UI虚拟化的更多信息,请参阅VirtualizingStackPanel

最后的建议。您可以尝试将UserControls重写为自定义控件。我的简单性能测试显示了以下数字。要使用相同的可视树创建10K控件:

  • for UserControl: 4932ms ;
  • for CustomControl: 86ms; (快〜57倍)

希望这有帮助