2010-01-19 37 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