我的应用程序正在将一堆相同的用户控件加载到ScrollPanel
. 问题是,这非常慢。
分析器显示,在Application.LoadComponent()
我的用户控件的构造函数的设计器代码中内部调用的方法是瓶颈。此方法的文档说,此方法加载XAML文件。
问题是,我怎样才能使用 BAML 而不是 XAML?在从它创建新实例时,我如何才能实现不能一次又一次地解析我的用户控件的 XAML?还有其他方法可以更快地加载我的用户控件吗?
我的应用程序正在将一堆相同的用户控件加载到ScrollPanel
. 问题是,这非常慢。
分析器显示,在Application.LoadComponent()
我的用户控件的构造函数的设计器代码中内部调用的方法是瓶颈。此方法的文档说,此方法加载XAML文件。
问题是,我怎样才能使用 BAML 而不是 XAML?在从它创建新实例时,我如何才能实现不能一次又一次地解析我的用户控件的 XAML?还有其他方法可以更快地加载我的用户控件吗?
LoadComponent()
已经加载了.baml
,不用担心这个问题。微软故意这样做,不让开发人员对baml
格式产生依赖。展望未来,他们可以在不破坏任何现有应用程序的情况下改进格式。
是的,还有另一种方法可以让它更快地工作。第一个优化是UI 虚拟化。WPF 已经附带了方便的VirtualizingStackPanel。它与 ItemsControls 协同工作,并且有一定的限制(例如,如果您创建项目容器并自己添加它们,您会失去虚拟化,或者如果您ScrollViewer.CanContentScroll="False"
再次松开它)。要使用虚拟化,您可能必须重写您的应用程序以使用ItemsControl + DataBinding
样式(ListBox
已启用虚拟化)
如果您觉得需要更多有关 UI 虚拟化的信息,请参阅Dan Crevier 的博客。
最后的建议。您可以尝试将您的用户控件重写为自定义控件。我的简单性能测试显示了以下数字。要使用相同的可视化树创建 10K 控件,需要:
希望这可以帮助