首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF InitializeComponent性能问题

WPF InitializeComponent性能问题
EN

Stack Overflow用户
提问于 2010-11-24 11:06:32
回答 3查看 5.7K关注 0票数 8

我有一个WPF应用程序(.NET 4),它有一个主窗口,在主窗口中显示了许多较小的UserControls。用户执行的各种动作导致所显示的UserControls被具有不同数据的不同其他控件所取代。

然而,在切换这些控件时,我遇到了性能问题。WPF dispatcher线程在加载控件时占用100%的CPU。在较旧的机器上,或者使用更多的控件,这可能会导致应用程序锁定长达30秒!

分析表明,几乎所有这些CPU时间都花在了调用所有不同UserControls的各种InitializeComponent方法上--没有一个控件比其他控件差得多,它们似乎都需要0.2到0.5秒(在我的开发机器上,处理器很快,显卡也很好)。

据我所知,InitializeComponent是WPF实际将编译好的xaml加载到内存中的地方。

我不知道在这里该做些什么。我想在后台线程上预初始化一些东西,但是所有的WPF控件都必须在dispatcher线程上创建和使用,所以我认为这是不可能的。

否则,我唯一的选择就是删除我所有的xaml??

任何帮助都将不胜感激

EN

回答 3

Stack Overflow用户

发布于 2012-09-03 04:53:22

回顾一下这一点-我们在屏幕上确实有很多复杂的控件,但我们不能仅仅为了让WPF高兴就把它们去掉!

进一步的分析实验表明,使用自定义控件(基本上只是一个直接从Control派生的C#类,并在Generic.xaml主题文件中定义UI )似乎只会导致加载和解析一次XAML。此后,每个控件只应用预先存在的主题。

自定义控件比UserControls更难使用,但这似乎确实对我们的加载性能有很大帮助。

票数 4
EN

Stack Overflow用户

发布于 2010-11-24 17:10:39

InitializeComponent方法需要时间,因为它需要将控件插入到可视/逻辑树中,并确保所有绑定、主题、预期资源等。

我唯一的建议是-是否可以从一开始就初始化所有潜在的控件,然后在需要时使用Visibility属性显示/隐藏它们?

你可以使用Freezable来缓存一些UI,但是如果它们是用户控件,那么你很可能希望你的用户与它们交互。

票数 0
EN

Stack Overflow用户

发布于 2015-08-10 03:28:02

根据记录,我有一个加载时间约为1500 ~2000ms的窗口,问题出在图标上。

我使用了一个用于将SVG转换为XAML DrawingImage元素的工具,以及一个具有大型资源字典的用户控件,每个使用的图标都有一个绘图图像。

InitializeComponent非常慢,因为它必须解析包含图像所有矢量数据的大型XAML文件

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4263128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档