WinForms 中的顶级 window
Top level window in WinForms
对于 WinForms 有很多关于此的问题,但我还没有看到提到以下情况的问题。
我有三种形式:
(X) Main
(Y) Basket for drag and drop that needs to be on top
(Z) Some other dialog form
X is the main form running the message loop.
X holds a reference to Y and calls it's Show() method on load.
X then calls Z.ShowDialog(Z).
现在在关闭 Z 之前无法再访问 Y。
我有点理解为什么(不是真的)。有没有办法让 Y 保持浮动,因为最终用户需要独立于任何其他应用程序表单与之交互。
在x中,你可以放一个y.TopMost = true;在 Z.ShowDialog() 之后。这会将 y 放在顶部。然后,如果你想让其他形式工作,你可以放一个 y.TopMost = false;在 y.TopMost = true 之后;这会将 window 放在最上面,但允许其他表格稍后覆盖它。
或者,如果问题是将一个表单放在另一个表单之上,那么您可以在表单属性中更改其中一个表单的起始位置。
您可以将主窗体 (X) 更改为 MDI 容器窗体 (IsMdiContainer = true)。然后您可以将剩余的窗体作为子窗体添加到 X。然后使用 Show 方法而不是 ShowDialog 来加载它们。这样所有的子表单都会在容器中浮动。
您可以像这样将子表单添加到 X:
ChildForm Y = new ChildForm();
Y.MdiParent = this //X is the parent form
Y.Show();
如果您想使用 ShowDialog
显示 window 但不希望它阻塞主窗体以外的其他 windows,您可以打开其他 windows在单独的线程中。例如:
private void ShowY_Click(object sender, EventArgs e)
{
//It doesn't block any form in main UI thread
//If you also need it to be always on top, set y.TopMost=true;
Task.Run(() =>
{
var y = new YForm();
y.TopMost = true;
y.ShowDialog();
});
}
private void ShowZ_Click(object sender, EventArgs e)
{
//It only blocks the forms of main UI thread
var z = new ZForm();
z.ShowDialog();
}
对于 WinForms 有很多关于此的问题,但我还没有看到提到以下情况的问题。
我有三种形式:
(X) Main
(Y) Basket for drag and drop that needs to be on top
(Z) Some other dialog form
X is the main form running the message loop.
X holds a reference to Y and calls it's Show() method on load.
X then calls Z.ShowDialog(Z).
现在在关闭 Z 之前无法再访问 Y。
我有点理解为什么(不是真的)。有没有办法让 Y 保持浮动,因为最终用户需要独立于任何其他应用程序表单与之交互。
在x中,你可以放一个y.TopMost = true;在 Z.ShowDialog() 之后。这会将 y 放在顶部。然后,如果你想让其他形式工作,你可以放一个 y.TopMost = false;在 y.TopMost = true 之后;这会将 window 放在最上面,但允许其他表格稍后覆盖它。
或者,如果问题是将一个表单放在另一个表单之上,那么您可以在表单属性中更改其中一个表单的起始位置。
您可以将主窗体 (X) 更改为 MDI 容器窗体 (IsMdiContainer = true)。然后您可以将剩余的窗体作为子窗体添加到 X。然后使用 Show 方法而不是 ShowDialog 来加载它们。这样所有的子表单都会在容器中浮动。
您可以像这样将子表单添加到 X:
ChildForm Y = new ChildForm();
Y.MdiParent = this //X is the parent form
Y.Show();
如果您想使用 ShowDialog
显示 window 但不希望它阻塞主窗体以外的其他 windows,您可以打开其他 windows在单独的线程中。例如:
private void ShowY_Click(object sender, EventArgs e)
{
//It doesn't block any form in main UI thread
//If you also need it to be always on top, set y.TopMost=true;
Task.Run(() =>
{
var y = new YForm();
y.TopMost = true;
y.ShowDialog();
});
}
private void ShowZ_Click(object sender, EventArgs e)
{
//It only blocks the forms of main UI thread
var z = new ZForm();
z.ShowDialog();
}