使用大量控件调整窗口大小时的WPF性能问题

时间:2011-01-10 17:42:31

标签: wpf performance controls resize window

我有一个WPF窗口,其中包含一个花式图像,大约有200个控件(从按钮派生),所有这些都使用我的5个模板中的一个(路径,阴影效果等)。同意,这是一个沉重的窗口。我可以忍受。

我的问题来自于调整窗口大小。最大化/恢复大约需要1-2秒,但手动拖动左下角会导致系统挂起约5-10秒。在那个延迟中,窗口是黑色的&包含部分剩余部分,直到显示最终结果。它看起来很业余, ,我无法忍受。

远程连接:使用远程帐户,我发现窗口调整大小总是需要1-2秒,但在拖动窗口边框时不会绘制“中间”阶段。结果像我期望的那样快速。

我的结论是:在调整大小期间重绘是瓶颈。

不可避免的问题是:如何在重新调整大小之前阻止重绘窗口?

提前感谢任何想法...

3 个答案:

答案 0 :(得分:4)

  

@Seb:我开始认为WPF是   不适用于接口   一次超过2-3个控件

Visual Studio 2010和Expression Blend应该是很好的反例。虽然Visual Studio有时会冻结瓶颈,但绝对不是WPF渲染。

   @Seb:不可避免的问题是:如何   我可以防止重绘窗口   直到调整大小完成?

在调整大小/最大化之前,只需将窗口的内容可见性设置为Visibility.Collapsed,然后将其显示为可见。虽然我认为你问了错误的问题。这是正确的

如何让我的控件快速测量/排列?

要回答它,你应该看看你的代码。也许您在测量/排列算法中集中使用依赖属性?或者你可能选择了错误的面板(例如Grid比Canvas慢)?或许......我在这里停止猜测:)。

顺便说一句,最好是在分析器下启动你的应用并证明瓶颈,而不是假设它可能在哪里。检查Eqatec Profiler它是免费但功能强大。 VS 2010还提供了很好的分析功能,但它远非免费。您可能需要查看WPF Performance Suite

希望这有帮助。

答案 1 :(得分:1)

让我知道这是如何工作的...我假设你的根视觉项目是水平和垂直拉伸,以自动高度/宽度填充你的窗口。摆脱自动高度/宽度。在应用启动时设置根元素的尺寸。 FrameworkElements有一个size changed event。在您的Application.Current.MainWindow上注册此内容(可能是一个错字,来自内存)。每当此事件触发时,以较小的间隔启动计时器。如果在计时器运行时再次调整大小,请忽略它并重置计时器。一旦定时器触发,您现在知道用户期望的新大小,并且他们(至少在短时间内)停止调整窗口大小。

希望有所帮助!

答案 2 :(得分:0)

来自Ragepotato's answer和你的评论,只要你没有让你的对象动态地重新定位自己,就需要大致看看调整大小时的界面a Wrap Panel) - 你可以截取窗口内容的截图并用它填充你的框架。
设置它可以拉伸高度和宽度,你会得到(稍微模糊)一个特定尺寸的概念。在调整大小时它不会生效,但对于那些可能无关紧要的几秒钟......