将表单添加到用户控件 - 这是否可行?

12

通常情况下,我们向表单中添加控件。但是我需要做相反的事情——将一个表单实例添加到容器用户控件中。

背后的原因是我需要将第三方应用程序嵌入到我的应用程序中。由于复杂性等原因,将表单转换为用户控件是不可行的。

2个回答

16

通过将表单的TopLevel属性设置为false可以实现。这将使其成为一个子窗口,几乎与UserControl无异。以下是具有所需代码的示例用户控件:

public partial class UserControl1 : UserControl {
    public UserControl1() {
        InitializeComponent();
    }
    public void EmbedForm(Form frm) {
        frm.TopLevel = false;
        frm.FormBorderStyle = FormBorderStyle.None;
        frm.Visible = true;
        frm.Dock = DockStyle.Fill;   // optional
        this.Controls.Add(frm);
    }
}

这个可以用,谢谢。我注意到一个小问题 - 嵌入的表单停止响应调整大小,保持固定大小。你有什么办法解决吗? - SharpAffair
那很正常,嵌入式控件通常不可由用户调整大小。将用户控件锚定到底部和右侧,以便随着其所在的窗体一起调整大小,从而改变嵌入式表单的大小。 - Hans Passant
嵌入式表单和用户控件都将 Dock 设置为 Fill。控件可以调整大小,但嵌入式表单不行。 - SharpAffair
当我尝试使用示例表单时,这个功能运行良好。我无法猜测您的表单可能有何不同。也许您可以通过在用户控件的OnResize重写中调用其Invalidate()方法来解决它。 - Hans Passant

1
根据Hans Passant的说法,我发现如果您将表单放入的控件是Flow Layout Panel,禁用WrapContents将修复一个对齐问题,即内容不会与FlowDirection内联放置。
        public void EmbedForm(Form frm)
        {
            frm.TopLevel = false;
            frm.FormBorderStyle = FormBorderStyle.None;
            frm.Visible = true;

            FLP_Inspector.WrapContents = false;
            FLP_Inspector.Controls.Add(frm);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接