2010-08-12 148 views
4

我正在研究一个感觉呆滞的WinForms项目。它由几百个用户控件组成。如果存在一段UI功能(即使未在应用程序的其他任何地方使用),它将封装在用户控件中。我已经用ANTS分析器多次浏览了这个项目,而且大部分代码看起来都在各种控制构造函数中。用户控件中是否有很多开销?

在我开始剥离用户控件之前,它们是否代表了WinForms应用程序的重要开销,而不是仅仅布置没有用户控件的表单(例如只是内部控件)呢?

+0

哇。当然有一些开销(类,初始化,实例化等)。你有没有90%或更多类似于原始控件的控件? (就像应用了少量或微小修改的定制版本)并且您是否一次显示所有控件?谢谢 – 2010-08-12 23:44:41

+0

@lb不,一次不显示全部。这实际上是一个非常大的项目。思考Outlook:你点击侧边栏中的按钮,然后出现一个全新的面板,其中有一个很大的控制,它本身包含较小的控件,反过来也包含更小的控件,如俄罗斯嵌套娃娃。 – AngryHacker 2010-08-13 00:03:40

回答

3

我一直在用户控制地狱,它不好玩。有几件事情我已经注意到:

  1. 如果你有太多的用户控制和移动你的形式或滚动,你可以有很多白色闪烁的风深深嵌套窗口的绘制操作手柄打为了渲染时间。首次打开表单时,这一点尤为明显。

  2. 注意设计器中的嵌套用户控件。如果在设计器中打开用户控件,则不会调用构造函数(它实际上是通过解析编译器生成的代码来生成设计器表面)。但是,该用户控件使用的用户控件将调用其构造函数。这通常不是问题,但是如果您发现奇怪的事情,则值得了解。

  3. 如果您有大量用户控件的大型解决方案,VS 2008将需要很长时间来枚举所有项目,以便在首次打开设计器窗格时查找所有可能的控件。这是一个相对较小的烦恼,但它可能会浪费时间。

也就是说,用户控件绝对方便,值得使用。我试图避免的主要事情是过深的嵌套。我发现WPF在这方面要好得多。它可以完全控制渲染管道,因此不会出现与深度控件组合相关的重绘问题。

+0

良好的观察。我通过一些创建样式设置解决了闪烁#1(http://www.angryhacker.com/blog/archive/2010/07/21/how-to-get-rid-of-flicker-on-windows-forms- applications.aspx)。我通过让每个控件继承基础控件来确定您是否处于设计模式,从而解决了#2问题。通过进入Tools/Options/WinForms Designer并关闭AutoToolBoxPopulate来解决#3问题。 – AngryHacker 2010-08-15 22:39:37

+0

@AngryHacker,闪烁的有趣解决方法;我将不得不记住,下一次我做另一个GUI重载的WinForms应用程序。 – 2010-08-15 23:35:46

3

用户控件是其他控件的容器。拥有数百个可能意味着您的项目中有数百个窗口。窗口是一个非常昂贵的操作系统对象。当你有超过50人左右的时候,他们开始明显地拖拽绘画表演。

与Outlook的比较很适合。这是一个大型的程序块。它有不到50个窗口。用Spy ++很容易看到。

区别在于OnPaint。微软写了很多代码,他们并没有在窗体上放下很多控件。

+0

+1,确切地说,真正的问题不是用户控件,而是窗口句柄。有趣的是,MS实际上正在使用诸如WPF之类的技术,通过DirectX在单个窗口中处理他们自己的绘图。窗口化是其时代的革命性概念,但由于更多的应用程序正在运行并且它们包含日益复杂的内容,因此特定的体系结构并没有很好地扩展。 – 2010-08-13 01:25:31

+0

一直都是这样。在VB6中值得注意的是支持无窗口控件。使用ToolStripItem类返回WinForms。而且,是的,WPF。 – 2010-08-16 00:11:14

相关问题