我有一个WPF应用程序(.NET 4),它有一个主窗口,在主窗口里面显示了许多较小的UserControls
。用户执行的各种操作会导致显示的UserControls
被不同的其他控件替换为不同的数据。
但是,在切换这些控件时,我遇到了性能问题。在加载控件时,WPF调度程序线程转到100%CPU。在较旧的机器上,或者控件数量较多时,这可能会导致应用程序锁定长达30秒!
分析表明几乎所有这些CPU时间花在调用所有不同InitializeComponent
的各种UserControls
方法上 - 没有一个控件似乎比其他任何控件差得多,它们似乎都采取了在0.2到0.5秒之间(在我的开发机器上,具有快速处理器和良好的图形卡)。
据我所知,InitializeComponent
是WPF实际将已编译的xaml加载到内存中的地方。
我不知道该怎么做。我想在后台线程上预先初始化东西,但是必须在调度程序线程上创建和使用所有WPF控件,所以我认为这不可行。
否则看起来我唯一的选择就是删除所有的xaml ??
非常感谢任何帮助
答案 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文件
希望它有所帮助。