WPF:具有页面导航的复合应用程序

时间:2010-01-19 20:34:41

标签: wpf navigation composite

我目前正在编写一个应用程序,复合方法就像手套一样....几乎!

我还需要一种在视图之间导航的方法,包括维护用于向前和向后导航的日志。

结合这两种方法的最佳方法是,一方面是基于Window的单个CAG shell及其UserControl派生的视图,另一方面是方便的NavigationWindow shell及其Page派生的观点和期刊?

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以在NavigationWindow中显示任何内容,而不只是Pages。使其工作的一种简单方法是在NavigationWindow的资源中为要显示的每个ViewModel定义DataTemplate。将Content的{​​{1}}属性绑定到您的主ViewModel的属性,您就完成了:更改该属性将更新NavigationWindow内容和相应的NavigationWindow将自动选择


更新

我只是查看了我使用DataTemplate的项目的代码。实际上我错了,它不能通过绑定NavigationWindow(或者它可能有效,但这不是我做的)。相反,我创建了一个Content接口,由我的INavigationService类实现,它通过调用App方法来处理导航。这样,导航历史记录由NavigationWindow.Navigate维护。

以下是我项目的摘录

MainWindow.xaml:

NavigationWindow

App.xaml.cs

<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>

当我需要导航到另一个视图时,我只需使用ViewModel作为参数调用 ... 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(); } 方法,WPF会自动从资源中选择适当的Navigate