2012-02-02 2 views
1

Я следующую задачу:Как скрыть пачку модальных форм в .NET Windows Forms

я открыть несколько модальных форм в стеке (например, form1 открывает модальное форму Form2, которая в свою очередь, открывает модальную форму вид3, и т.п.). Я хотел бы скрыть весь стек.

Я попытался вызвать метод Hide или установить свойство Visible в родительском, но это только скрывает родителя. Я также попытался скрыть каждую форму отдельно, но тогда мне нужно вызвать ShowDialog на каждой из форм, которая блокирует поток, в котором я вызываю вышеупомянутый метод.

Есть ли способ установить модальные диалоги так, чтобы они наследовали статус родителя и спрятались в каскаде, просто установив свойство в первую форму?

Я также открыт для других предложений.

+4

Модальный диалог означает: «Пожалуйста, сделайте что-нибудь прямо сейчас, прежде чем продолжить». Имея модальные формы над модальными формами, а затем желая просто скрыть их, вы не * действительно * используете модальные формы так, как они были предназначены. Подумайте о пересмотре интерфейса gui. – LarsTech

+0

К сожалению, решение этой проблемы путем перепроектирования графического интерфейса не является вариантом. Даже если бы это было возможно, я думаю, что текущий дизайн действителен, так как могут быть случаи, когда форма может иметь сложную функциональность. Поэтому, если форма, запрашивающая внимание пользователя, имеет достаточно сложную логику, необходимо также заблокировать эту форму, которая блокирует родителя. Кроме того, три уровня глубины для бизнес-процесса кажутся вполне приемлемыми для бизнес-приложений. – Bogdan

ответ

1

Чтобы повторно отобразить форму, которую вы спрятали, установив obj.Visible = false только что установленный , а не ShowDialog.

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

1

Поскольку вы говорите о модальных диалогах, это будет последний, который откроется, чтобы начать это действие. Откройте все формы, как в следующем примере, а затем Hide(), что последний.

public partial class Form1 : Form 
{ 
    Form2 frm2 = new Form2(); 

    public Form1() 
    { 
     InitializeComponent(); 
     frm2.VisibleChanged += frm2_VisibleChanged; 
     Shown += Form1_Shown; 
    } 

    void Form1_Shown(object sender, EventArgs e) 
    { 
     frm2.ShowDialog(); 
    } 

    void frm2_VisibleChanged(object sender, EventArgs e) 
    { 
     if (frm2.Visible == false) Hide(); 
    } 
} 
+0

Это очень хороший пример каскадирования вызова метода Hide, но я предпочитаю решение Бена, поскольку мне легче установить свойство Visible в список форм, чем изменить всю архитектуру моего приложения. – Bogdan

+0

@Bogdan Нет проблем. И не забудьте «Dispose» формы ShowDialog. (См. Http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx) – ispiro

Смежные вопросы