代码之家  ›  专栏  ›  技术社区  ›  AngryHacker

用户控件中是否有大量开销?

  •  4
  • AngryHacker  · 技术社区  · 14 年前

    我在做一个WinForms项目,感觉很迟钝。它由数百个用户控件组成。如果有一个UI功能(即使在应用程序的其他地方没有使用),它将封装在用户控件中。我已经用ANTS profiler检查过这个项目很多次了,大部分繁重的代码似乎都在不同的控件构造函数中。

    在我开始剥离用户控件之前,它们是否代表了WinForms应用程序的巨大开销,而不是仅仅在没有用户控件的情况下(例如,仅仅是内部控件)布局窗体?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Dan Bryant    14 年前

    我一直在用户控制地狱,这是不好玩的。我注意到一些事情:

    1. 如果用户控件太多,并且在窗体周围移动或滚动,则会出现大量白色闪烁,因为嵌套较深的窗口句柄的绘制操作会为渲染时间而争斗。当您第一次打开窗体时,这一点尤其明显。

    2. 如果您有一个包含大量用户控件的大型解决方案,那么VS2008将花费很长时间来枚举所有项目,以便在您第一次打开设计器窗格时找到所有可能的控件。这是一个相对较小的烦恼,但它可以消耗时间。

    也就是说,用户控件非常方便,值得适度使用。我尽量避免的主要事情是过深的筑巢。我发现WPF在这方面要好得多。它可以完全控制渲染管道,因此您不会遇到与控件深度组合相关的重新绘制问题。

        2
  •  3
  •   Hans Passant    14 年前

    用户控件是其他控件的容器。拥有数百个窗口可能意味着项目中有数百个窗口。窗口是一个非常昂贵的操作系统对象。当你有超过50张左右的照片时,它们会明显地拖累你的绘画效果。

    与Outlook的比较是恰当的。这是一个相当大的程序块。它只有不到50扇窗户。使用Spy++很容易看到。

    区别就在油漆上。微软写了很多代码,他们没有在表单上删除很多控件。