2014-02-09 41 views
0

我是一名經驗豐富的MVC開發人員,爲我工作的公司內部WinForms生產應用程序做了第一次嘗試。WinForms:在同一窗口中顯示新窗體

當我的應用程序第一次加載它時,加載一個LoginForm(它繼承BaseForm來設置窗口大小,NotifyIcon屬性等)。成功登錄後,我想保留相同的窗口,但用新屏幕替換內容。這似乎很基本,但即使在尋找如何做到這一點,它沒有像我期望的那樣工作。

我已經試過這樣的代碼:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Window1 W1 = new Window1(); 
    W1.Show(); 
    this.Close();  
} 

當然不過,打開一個新窗口並關閉當前的一個,這是不是我想要的。我想保留相同的父窗口,只是替換內容。

我有兩個問題(有幾分相關):

1)如何簡單地替換父窗口的內容以新的形式,而不是在新窗口中打開它?現在我的表單在單獨的WinForms控件(LoginForm和ChatForm)中。我是否需要以不同的方式構建我的項目才能實現這一目標?

2)ChatForm包含一個帶左邊按鈕的SplitContainer(見下面的截圖)。單擊每個按鈕時,右側窗格的內容應該改變。這些最好用UserControls表示(一個用於ChatQueue,一個用於ChatWindow,傳入參數讓它知道我們正在聊天的人)?

試圖讓我的頭在基本的WinForms項目體系結構和不同的內容屏幕之間導航。

enter image description here

+0

我的建議是清除所有的控件(或那些你想要去的),然後在同一個表單上添加其他控件。 – MiKE

回答

2

你可以把第一個「窗口」的控制面板上Dock = DockStyle.Fill而不是直接的形式。而第二個「窗口」的另一個類似的控制面板Dock。兩個小組都在表格上。然後panel1.SendToBack();。 (或者panel2.BringToFront();

或者,您可以:

Controls.Remove(panel1); 
Controls.Add(panel2); 

,如果你寧願做。

0

我強烈建議你創建一個登錄用戶控件和聊天用戶控件。

要比較網頁,窗口就像一個頁面...你不能不刷新頁面,所以如果你想保持涼爽的Ajax外觀,並感覺你創建一個頁面的應用程序,並在其中粘貼不同的控件。

至於體系結構,不建議將所有控件放在窗口級別或使用佈局控件(面板)創建邏輯分離。

構建用戶控件的良好用戶界面是winforms應用程序的標準體系結構。

祝你好運。

1

1)是的,你必須以不同的方式構建項目。

將窗體想象成一個父窗體。所有其他形式(登錄,聊天)需要設計爲用戶控件。然後,您必須將所有控件放在父窗體中,並且必須以編程方式管理這些控件的順序,即登錄應該先於聊天等。然後引入一個類似於NavigationController的類,它將負責管理控件的順序,即隱藏登錄和顯示聊天等。類可以在內部維護堆棧以管理轉換。

2)是的,你是對的。使用UserControls的相同概念適用於此!

確實,MVC開發人員在使用WinForms時發現非常困難的時間。但好消息是,您可以通過手動實現MVC的理論概念,在WinForms中完成類似的設計。

0

爲了達到這個效果,我會使用TabControl來佈局右側,並簡單地根據點擊的按鈕切換標籤頁。

有些方法可以隱藏選項卡,如果你想要的話,它可以模擬類似於交換Panel控件的東西,但沒有醜陋的Controls.Add()調用。