Окно верхнего уровня в 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).

Теперь Y больше не доступен, пока Z не закрыт.

Я могу несколько понять почему (не совсем). Есть ли способ сохранить Y плавающим, поскольку конечный пользователь должен взаимодействовать с ним независимо от любых других форм приложения.

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

Вы можете изменить свою основную форму (X) на форму контейнера MDI (IsMdiContainer = true). Затем вы можете добавить оставшиеся формы как дочерние формы в X. Затем используйте метод Show вместо ShowDialog, чтобы загрузить их. Таким образом, все дочерние формы будут плавать в контейнере.

Вы можете добавить дочерние формы к X следующим образом:

ChildForm Y = new ChildForm();
Y.MdiParent = this //X is the parent form
Y.Show();

В x вы можете поместить y.TopMost = true; после Z.ShowDialog(). Это поставит y на вершине. Затем, если вы хотите, чтобы другие формы работали, вы можете поставить y.TopMost = false; сразу после y.TopMost = true; Это поместит окно сверху, но позволит другим формам проходить через него позже.

Или, если проблема заключается в том, что одна форма помещается поверх другой, вы можете изменить начальную позицию одной из форм в свойствах формы.

Другие вопросы по тегам