2012-10-12 182 views
3

我是新来使用WPF,我倒要看看是什么人推荐的最佳实践,当谈到在使用MVVM光工具包一个WPF应用程序在多个屏幕进行导航。作为新的WPF,请原谅我,如果我的术语是不正确的,我不知道,如果正确的术语是“切换视图”,“浏览网页”,“更改窗口”,还是其他什么东西(澄清这些条款涉及到WPF将不胜感激)。切换屏幕之间WPF

为了澄清什么,我想做的事:我有3全屏页/视图,用户应该能够从来回移动的应用程序。这些视图永远不会同时显示,因此它们最容易与选项卡控件中的选项卡进行比较;除了我不想要标签控件通常附带的标签条。相反,我想以编程方式在页面/视图之间切换。

我过流答案看过一些不同的方法,在下面的堆栈:

  1. https://stackoverflow.com/a/6114865/1081879
  2. How to navigate through windows with MVVM Light for WPF?

因此,其实我只是想知道这上面的方法来我应该去的方向是什么?我已经实际执行的第一个答案,但我不知道如果这样做,这是一个“滥用” /数据模板“黑客”,或者如果这是怎样的框架应该被使用。

最后,也许MVVM Light是不是我就可以使用,如果其他工具包提供了这个功能开箱即用最适合的工具包。任何人都可以阐明这个概念,也许会推荐一个更适合的工具箱?

感谢,

+1

实际上,WPF应该如何工作:)您的应用程序由您创建的对象(ViewModels/Models)组成,您可以使用DataTemplates和UI对象来告诉WPF如何绘制应用程序。这与WinForms正好相反,您可以使用UI对象构建应用程序,并为它们提供所需的数据。 – Rachel

+0

比我第二次回答的导航设施准确地参考了什么? –

+0

我以前没有使用过的代码,但它似乎是完成同样的事情的框架。您将对象设置为“当前”页面,并使用“ViewModelLocator”来定位正确的视图来绘制页面。 – Rachel

回答

1

导航的快速和肮脏的例子(这是在这里,而不是写在VS所以如果事情是拼写错误,请应用的修补程序):

,让我们创建我们的意见的分层描述:

public abstract Class ViewModelBase : INotifyPropertyChanged{} 
    public abstract Class ViewModelNavigationBase : ViewModelBase {} 
    public Class ViewModel1 : ViewModelNavigationBase {} 
    public Class ViewModel2 : ViewModelNavigationBase {} 
    public Class ViewModel3 : ViewModelNavigationBase {} 

    public Class MainViewModel : ViewModelBase 
    { 
     private ViewModelNavigationBase currentViewModel; 
     public ViewModelNavigationBase CurrentViewModel 
     { 
     get{return currentViewModel;} 
     set 
     { 
      currentViewModel = value; 
      OnPropertyChanged("CurrentViewModel");     
     } 
     }   

     private const int numberOfPages = 3 ; 
     private int index; 
     private ViewModelNavigationBase[numberOfPages] pages; 
     .... 
     ... OnNavigateCommand() 
     { 
      index++; 
      index = index % numberOfPages; 
      CurrentViewModel = pages[index]; 
     } 

} 

资源:

 <local:MainViewModel x:Key="MainVm" /> 

    <DataTemplate TargetType={x:Type local:ViewModel1}> 
     <local:View1 /> 
    </DataTemplate> 

    <DataTemplate TargetType={x:Type local:ViewModel2}> 
     <local:View2 /> 
    </DataTemplate> 

    <DataTemplate TargetType={x:Type local:ViewModel3}> 
     <local:View3 /> 
    </DataTemplate> 

X aml:

<Window x:Name="MainWindow" 
     DataContext={StaticResource MainVm}> 
     <StackPanel> 
      <ContentControl Content={Binding CurrentViewModel} /> 
      <Button Content="Navigate" Command="{Binding NavigateCommand}"/> 
     </StackPanel>  
</Window>  
+0

谢谢,我已经按照我链接到的第一个答案执行了此操作。我想知道为什么这比第二个答案更受欢迎,哪一个是正确的路要走。 –

+0

以及使用第三方库的MVVM Light工具包,这不是wpf框架的一部分, 我认为在框架之上实现更具优势,因为您可以维护自己的代码,还可以更清晰地了解框架如何工作。 –