如何在 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;
使表格显示出来!
谢谢汉斯!
我想做的事情:
- 有两种不同的形式
- 将第一个窗体拖到第二个窗体中,并将其停靠在第二个窗体的面板中。
- 之后我希望能够将第一个表单从第二个表单中拖回并使其再次独立。
将第一个表单拖放到第二个表单中是可行的。但是我无法从第二种形式中取回表格。当我拖出来的时候,它就消失了。
因为拖放操作使示例代码变得比必要的更复杂,所以我将其省略。相反,我使用了按钮。示例表单有两个按钮和一个面板。当按下按钮 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;
使表格显示出来!
谢谢汉斯!