如何在 c# winforms 中取消停靠和分离停靠在另一个窗体中的窗体

How to undock and separate a form that is docked in another form in c# winforms

我想做的事情:

将第一个表单拖放到第二个表单中是可行的。但是我无法从第二种形式中取回表格。当我拖出来的时候,它就消失了。

因为拖放操作使示例代码变得比必要的更复杂,所以我将其省略。相反,我使用了按钮。示例表单有两个按钮和一个面板。当按下按钮 one 时,表单会将其自身的副本放入面板中。当按下按钮二时,复制表单应该被取消停靠并显示为一个单独的表单。最后一部分不起作用。相反,复制表单消失了。

我想做的是不可能的,还是我做错了什么?

编辑:根据 Hans 的评论,我现在知道出了什么问题。我更改了下面的代码以使其工作。我在更改的代码行后面添加了注释

public partial class Form1 : Form
{
    private Form1 CopyForm;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (CopyForm == null)
        {
            CopyForm = new Form1();
            CopyForm.TopLevel = false;
            CopyForm.Parent = panel1;
            CopyForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            CopyForm.Dock = DockStyle.Fill;
            CopyForm.Show();
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        CopyForm.Dock = DockStyle.None;
        CopyForm.Parent = null;

        panel1.Controls.Clear();

        CopyForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
        CopyForm.StartPosition = FormStartPosition.CenterScreen;
        CopyForm.Size = new Size(500, 500);
        CopyForm.TopMost = true;
        CopyForm.TopLevel = true; // <== This line was the fix to my problem
        CopyForm.Show();
    }
}

正如 Hans Passant 指出的那样, CopyForm.TopLevel 未在 button2_Click 方法中设置为 true。 添加 CopyForm.TopLevel = true; 使表格显示出来! 谢谢汉斯!