2014-08-29 148 views
2

我有一個窗口,有3種類型的內容可以顯示(它們都是UserControl類型)。C#WPF內容切換

1)登錄視圖
2)應用程序的查看
3)錯誤報告

請告訴我最適當的方式將這些之間切換?我的想法是在構造函數中傳遞Window的實例,然後解決它的內容。

Content = new LoginView(this); 

,然後改變從LoginView內容,

public LoginView(Window wnd){ 
    InitializeComponents(); 
    wnd.Content = new MainView(wnd); 
} 

,但這不會更新窗口的內容,它是引起作爲窗口的當前內容的調用者(LoginView)?如果是這樣的話,處理這種情況的正確方法是什麼?

另請注意,所提供的代碼段不包含任何邏輯,我只是​​簡單地根據需要將其展示出來,以演示我正面臨的問題。

編輯:基本上這些控制之間的連接是這樣的:

1)登錄視圖
- 應用程序啓動時
- 當應用程序窗口發送返回未授權

的請求(到服務器)

2)應用程序的查看
- 處理所有應用程序的feautures

3)錯誤視圖
- 在出現錯誤時替換應用/登錄視圖並通知用戶有關如何操作

+0

[考慮使用](https://wpftoolkit.codeplex.com/wikipage?title=Wizard)[嚮導](http://www.codeproject.com/Articles/31837/Creating-an-Internationalized-Wizard -in-WPF)[控件的種類](http://msdn.microsoft.com/en-us/library/aa972123(v = vs.85).aspx):p – Kilazur 2014-08-29 13:13:24

+0

這個想法是正確的,但你應該處理「導航「,而不是在控件構造函數中。 – Pragmateek 2014-08-29 13:14:05

+0

這些表單共享什麼關係?它聽起來像應用程序窗體應該控制打開其他窗體 – Sayse 2014-08-29 13:16:30

回答

2

您應該看看MVVM模式。當使用MVVM模式時,通常每個用戶控件/視圖都應該有自己的視圖模型。所以你可以在MainView中定義不同的視圖。如下面的示例所示:

<Window.Resources> 
    <DataTemplate x:Key="LoginView" DataType="{x:Type ViewModel:LoginViewModel}"> 
      <local:LoginView /> 
    </DataTemplate> 
    <DataTemplate x:Key="AppView" DataType="{x:Type ViewModel:AppViewModel}"> 
      <local:AppView /> 
    </DataTemplate> 
<Window.Resources> 

因此,在您的MainView代碼中,您必須在ContentControl中傳遞適當的ViewModel。這將引用正確的視圖。

<ContentControl Content="{Binding LoginViewModel}" /> 

所以DataTemplate將顯示,取決於傳遞的xxxViewModel。