WPF InitializeComponent性能问题

时间:2010-11-24 03:06:32

标签: c# wpf performance

我有一个WPF应用程序(.NET 4),它有一个主窗口,在主窗口里面显示了许多较小的UserControls。用户执行的各种操作会导致显示的UserControls被不同的其他控件替换为不同的数据。

但是,在切换这些控件时,我遇到了性能问题。在加载控件时,WPF调度程序线程转到100%CPU。在较旧的机器上,或者控件数量较多时,这可能会导致应用程序锁定长达30秒!

分析表明几乎所有这些CPU时间花在调用所有不同InitializeComponent的各种UserControls方法上 - 没有一个控件似乎比其他任何控件差得多,它们似乎都采取了在0.2到0.5秒之间(在我的开发机器上,具有快速处理器和良好的图形卡)。

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

我不知道该怎么做。我想在后台线程上预先初始化东西,但是必须在调度程序线程上创建和使用所有WPF控件,所以我认为这不可行。

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

非常感谢任何帮助

3 个答案:

答案 0 :(得分:3)

要重新审视这一点 - 我们在屏幕上有很多复杂的控件,但我们不能只是摆脱它们以保持WPF的快乐!

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

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

答案 1 :(得分:0)

InitializeComponent方法需要时间,因为它需要在Visual / Logical树中插入控件并确保所有绑定,主题,预期资源等。

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

您可以使用Freezable缓存某些UI,但如果它们是用户控件,那么您很可能希望用户与它们进行交互。

答案 2 :(得分:0)

为了记录,我有一个加载时间约为1500~2000毫秒的窗口,问题是图标

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

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

希望它有所帮助。