我有一个WPF应用程序(.NET 4),它有一个主窗口,在主窗口中显示了许多较小的UserControls。用户执行的各种动作导致所显示的UserControls被具有不同数据的不同其他控件所取代。
然而,在切换这些控件时,我遇到了性能问题。WPF dispatcher线程在加载控件时占用100%的CPU。在较旧的机器上,或者使用更多的控件,这可能会导致应用程序锁定长达30秒!
分析表明,几乎所有这些CPU时间都花在了调用所有不同UserControls的各种InitializeComponent方法上--没有一个控件比其他控件差得多,它们似乎都需要0.2到0.5秒(在我的开发机器上,处理器很快,显卡也很好)。
据我所知,InitializeComponent是WPF实际将编译好的xaml加载到内存中的地方。
我不知道在这里该做些什么。我想在后台线程上预初始化一些东西,但是所有的WPF控件都必须在dispatcher线程上创建和使用,所以我认为这是不可能的。
否则,我唯一的选择就是删除我所有的xaml??
任何帮助都将不胜感激
发布于 2012-09-03 04:53:22
回顾一下这一点-我们在屏幕上确实有很多复杂的控件,但我们不能仅仅为了让WPF高兴就把它们去掉!
进一步的分析实验表明,使用自定义控件(基本上只是一个直接从Control派生的C#类,并在Generic.xaml主题文件中定义UI )似乎只会导致加载和解析一次XAML。此后,每个控件只应用预先存在的主题。
自定义控件比UserControls更难使用,但这似乎确实对我们的加载性能有很大帮助。
发布于 2010-11-24 17:10:39
InitializeComponent方法需要时间,因为它需要将控件插入到可视/逻辑树中,并确保所有绑定、主题、预期资源等。
我唯一的建议是-是否可以从一开始就初始化所有潜在的控件,然后在需要时使用Visibility属性显示/隐藏它们?
你可以使用Freezable来缓存一些UI,但是如果它们是用户控件,那么你很可能希望你的用户与它们交互。
发布于 2015-08-10 03:28:02
根据记录,我有一个加载时间约为1500 ~2000ms的窗口,问题出在图标上。
我使用了一个用于将SVG转换为XAML DrawingImage元素的工具,以及一个具有大型资源字典的用户控件,每个使用的图标都有一个绘图图像。
InitializeComponent非常慢,因为它必须解析包含图像所有矢量数据的大型XAML文件
希望能有所帮助。
https://stackoverflow.com/questions/4263128
复制相似问题