使用Windows窗体作为控件是不是很糟糕?

时间:2011-10-20 08:52:20

标签: .net winforms

我知道可以在另一个表单中使用Form作为子控件。

ChildForm child = new ChildForm();
child.TopLevel = false;
child.FormBorderStyle = FormBorderStyle.None;
child.Show();
containerControl.Controls.Add(child);

我意识到这不是Form的设计目标。我想知道这里的含义是什么,而不是使用UserControl?有没有真正的缺点?任何大的,不必要的开销?任何意想不到的行为?

另一方面,使用表格有什么好处吗?您可以使用表单对UserControl执行任何操作,如果用作子控件,这可能很有用吗?

我理解FormUserControl都会继承ContainerControl,但是他们的非继承成员有多么不同呢?

我的方案

我问的原因是因为我有一个现有的Form控件,我喜欢有时会自行显示(用于开发和作为一个额外的功能) ),但它不需要。但是,我确实需要表单的Closing事件(不是从ContainerControl继承),如果文件已被编辑但未保存,我需要能够取消关闭表单。

我在调查结果中也注意到Form似乎有UserControl似乎没有的透明度选项,但我不确定这些选项是否有效表格用作儿童控制。

1 个答案:

答案 0 :(得分:1)

如果你检查MSDN中的继承层次结构,你发现UserControl和Form都继承自ContainerControl,所以事实上直到他们的基类几乎所有东西都应该是相同的。

这么说,一般来说,我认为你应该避免使用托管作为控件的Form对象,除非你正在处理遗留的不可更改的代码,或者除非你绝对希望这个设计能够在在某些其他情况下,将表单单独显示为顶级非托管位置。

如果您只需要一个容器来放置其他UI控件,则可以使用UserControl。

实际上,Win32级别的所有内容都转换为句柄和消息泵/ WindowProc等,即使是简单的TextBox也会有一个句柄,并且会接收和使用消息来处理客户端和非客户区等等。