WinForms中的顶级窗口

时间:2016-01-30 23:52:13

标签: c# .net winforms dialog toplevel

关于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浮动,因为最终用户需要独立于任何其他应用程序表单与其进行交互。

3 个答案:

答案 0 :(得分:3)

如果要使用ShowDialog显示窗口,但不希望它阻止除主窗体之外的其他窗口,则可以在单独的线程中打开其他窗口。例如:

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

答案 1 :(得分:0)

在x中,你可以把y.TopMost = true;在Z.ShowDialog()之后。这将使y位于顶部。然后,如果你想要其他形式工作,你可以把y.TopMost = false;在y.TopMost = true之后;这会将窗口置于顶部,但稍后允许其他表单覆盖它。

或者,如果问题是一个表单放在另一个表单之上,那么您可以在表单的属性中更改其中一个表单的起始位置。

答案 2 :(得分:0)

您可以将主窗体(X)更改为MDI容器窗体(IsMdiContainer = true)。然后,您可以将剩余的表单作为子表单添加到X.然后使用Show方法而不是ShowDialog来加载它们。这样,所有子表单都将在容器中浮动。

您可以将子表单添加到X中,如下所示:

(LocalDB)