3

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

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

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

4

1 回答 1

5

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

是的,还有另一种方法可以让它更快地工作。第一个优化是UI 虚拟化。WPF 已经附带了方便的VirtualizingStackPanel。它与 ItemsControls 协同工作,并且有一定的限制(例如,如果您创建项目容器并自己添加它们,您会失去虚拟化,或者如果您ScrollViewer.CanContentScroll="False"再次松开它)。要使用虚拟化,您可能必须重写您的应用程序以使用ItemsControl + DataBinding样式(ListBox已启用虚拟化)

如果您觉得需要更多有关 UI 虚拟化的信息,请参阅Dan Crevier 的博客

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

  • 对于用户控制:4932 毫秒
  • 对于自定义控件:86 毫秒;(约快 57 倍)

希望这可以帮助

于 2011-01-08T22:25:28.030 回答