首页 > 解决方案 > 如何在c#winforms中取消停靠和分离停靠在另一个窗体中的窗体

问题描述

我想做的事:

在第二个表单中拖动和停靠第一个表单有效。但我无法从第二个表格中取回表格。当我把它拖出来时,它就消失了。

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

我试图做的事情是不可能的,还是我做错了什么?

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

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();
    }
}

标签: c#winformsdocking

解决方案


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


推荐阅读