Winforms:不同用户控件的通用主机表单?

时间:2011-04-08 13:32:04

标签: winforms user-controls

我正在开发一个Winforms项目,该项目将有几个“查找”样式的用户控件。这些控件可以嵌入各种形式,但通常是独立的。我想设计一个Windows窗体,它可以托管通用用户控件并执行这些查找共有的几个任务。我的大脑告诉我这样做,但这显然不起作用:

public partial class LookupHostForm<TUserControl> : Form where TUserControl : UserControl

有没有办法可以使用一个表单来托管多个用户控件,而不知道/关心用户控件是什么形式?

2 个答案:

答案 0 :(得分:1)

你当然可以按需要做。

只需添加一个构造函数,该构造函数接受您想要的UserControl的类型或实例。然后将其添加为构造函数中表单的子控件。或者添加一个创建特定感兴趣控件的虚方法,并为每个派生类重写虚拟并返回正确类型所需的每个变体都有一个派生类。或者有一个指定控件的属性。有很多方法可以做到。

答案 1 :(得分:1)

表单“托管”用户控件的方式是将用户控件的实例作为子控件添加到表单中。每个表单都有一个公开Controls property,可以公开ControlsCollection类。这是该表单托管的所有子控件的集合。

您只需将用户控件添加到表单的Controls集合中即可。这将具有您想要的效果。例如:

CustomUserControl uc = new CustomUserControl();
myForm.Controls.Add(uc);

要消除效果,您可能还希望停靠用户控件以填充其主机表单的整个客户区域,或将其锚定到所有四个方面。停靠将导致用户控件的大小在其主机窗体的大小更改时更改。锚定只会将用户控件置于其主机中间。使用用户控件的适当命名的DockAnchor属性来实现此效果。

当然,任何表单对象都可以执行此操作。我将子类化Form类并公开一个强类型方法,以将我的用户控件的实例添加到其控件集合中。例如:

public class HostForm : Form
{
    public void SetChildControl<TUserControl>(TUserControl ctrl) where TUserControl : UserControl
    {
        // Add the specified user control to the forms controls collection
        this.Controls.Add(ctrl);

        // Dock the user control in its host form
        ctrl.Dock = DockStyle.Fill;
    }
}