2010-01-19 50 views
0

我目前正在編寫一個應用程序,複合方法適合像手套....幾乎!WPF:複合應用程序與頁面導航

我還需要一種在視圖之間導航的方式,包括維護用於向後和向前導航的日記。

什麼是這兩種方法及其衍生UserControl合併的意見,一方面單Window基於CAG外殼的最佳方式,而在另一方面,方便NavigationWindow外殼,其Page得出的觀點和雜誌?

謝謝!

回答

4

您可以在NavigationWindow中顯示任何內容,而不僅僅是Pages。使其工作的一種簡單方法是在NavigationWindow的資源中定義一個DataTemplate,用於您要顯示的每個ViewModel。該NavigationWindowContent屬性綁定到你的主視圖模型的屬性,你就大功告成了:改變該屬性將更新NavigationWindow內容,並適當DataTemplate都會被自動


UPDATE

我只看了一個我使用NavigationWindow的項目的代碼。其實我錯了,它通過綁定Content不起作用(或者它可行,但那不是我所做的)。相反,我創建了一個INavigationService界面,由我的App類實現,該類通過調用NavigationWindow.Navigate方法處理導航。這樣,導航歷史由NavigationWindow維護。

下面是我的項目的提取

MainWindow.xaml:

<NavigationWindow x:Class="MyApp.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:vm="clr-namespace:MyApp.ViewModel" 
        xmlns:view="clr-namespace:MyApp.View" 
        Title="{Binding Content.DisplayName, RelativeSource={RelativeSource Self}, FallbackValue=The Title}" 
        Height="600" Width="800"> 
    <NavigationWindow.Resources> 
     <DataTemplate DataType="{x:Type vm:HomeViewModel}"> 
      <view:HomeView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type vm:CustomerViewModel}"> 
      <view:CustomerView /> 
     </DataTemplate> 
    </NavigationWindow.Resources> 
</NavigationWindow> 

App.xaml.cs

... 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     LoadConfig(); 

     MyApp.MainWindow window = new MainWindow(); 
     INavigationService navigationService = this; 
     HomeViewModel viewModel = new HomeViewModel(navigationService); 
     this.MainWindow = window; 
     window.Navigate(viewModel); 
     window.Show(); 
    } 

當我需要導航到另一個視圖,我只是將ViewModel作爲參數調用Navigate方法,WPF autom從資源中挑選合適的DataTemplate

+0

這是一個不錯的和簡單的解決方案,但對我的口味來說有點過於簡單。我有它的問題:日記,查看生存期管理,查看狀態,導航歷史中的多個視圖,'PageFunction'功能(能夠以模態方式調用視圖)。 或者,也許我不完全瞭解你的解決方案,你能詳細說一點嗎? – 2010-01-19 20:52:37

+0

另一個值得關注的問題是能否以相對獨立的方式開發視圖(與shell解耦)。基本上,你說我根本不應該使用CAG,而是使用一種解決方法來使常規的'NavigationWindow'感覺像CAG。但後來我失去了CAG提供的優勢,模塊的動態加載,獨立模塊開發等。 – 2010-01-19 21:20:43

+0

感謝Thomas的額外細節,但我仍然不高興。你所說的是'創建一個常規的導航應用程序,並自己實現CAG部件' - 這意味着我需要提供一個統一容器,動態加載模塊,爲視圖動態創建數據模板等。我寧願換個角度來說,使用CAG並實現導航並記錄下自己。+1至少讓我看到我**不想**想要做的事情:-) – 2010-01-19 21:54:38