2012-02-02 45 views
1

我有以下問題:如何隱藏在.NET中的Windows模式表格紙疊窗體

我在堆棧中打開多個模式的形式(例如,Form1中打開這反過來又打開模式窗體模式窗體窗口2 form3等)。我想隱藏整個堆棧。

我嘗試調用Hide方法或在父級上設置Visible屬性,但這隻隱藏父級。我也嘗試過單獨隱藏每一個表單,但是之後我必須在每個表單上調用ShowDialog來鎖定我稱之爲前述方法的線程。

是否有方法來設置模式對話框,以便它們繼承父級的狀態並通過在第一個窗體上設置屬性而隱藏在級聯中?

我也接受其他建議。

+4

模態對話意味着:「請在繼續之前先做一些事情」。模態形式超過模態形式,然後想要隱藏它們意味着你不是*真正*使用模式形式的方式。考慮修改你的GUI界面。 – LarsTech 2012-02-02 16:26:14

+0

不幸的是,通過重新設計GUI來解決問題不是一種選擇。即使有可能,我認爲當前的設計是有效的,因爲可能會出現表單可能具有複雜功能的情況。因此,如果請求用戶注意的表單具有足夠複雜的邏輯,則可能會出現鎖定鎖定其父項的表單的需要。此外,業務流程的三個深度對於業務應用程序來說似乎是可以接受的。 – Bogdan 2012-02-02 18:05:08

回答

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方法調用的一個很好的例子,但我更喜歡Ben的解決方案,因爲我更容易將Visible屬性設置爲表單列表,而不是修改我的應用程序的整個體系結構。 – Bogdan 2012-02-03 09:58:50

+0

@Bogdan沒問題。別忘了'處理'ShowDialog表單。 (請參閱http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx) – ispiro 2012-02-03 13:15:01

相關問題