在屏幕之间切换WPF

时间:2012-10-12 15:16:35

标签: wpf mvvm-light

我是使用WPF的新手,我想看看在使用MVVM Light Toolkit的WPF应用程序中浏览多个屏幕时,人们推荐的最佳做法。作为WPF的新手,如果我的术语不正确,请原谅我,因为我不确定正确的术语是“切换视图”,“导航页面”,“更改窗口”或其他内容(这些术语的说明与WPF将不胜感激。)

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

我已经看到了几种不同的方法,在以下堆栈中的流程答案:

  1. https://stackoverflow.com/a/6114865/1081879
  2. How to navigate through windows with MVVM Light for WPF?
  3. 所以我真的只是想知道上述方法中的哪一个是我应该进入的方向?我已经实际实现了第一个答案,但我不确定这是否是数据模板的“滥用”/“黑客”,或者这是否应该如何使用框架。

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

    谢谢,

2 个答案:

答案 0 :(得分: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>

xaml:

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

答案 1 :(得分:1)

我在这个问题中真正想要的是一个参考资料,显示我列出的两种方法中的一种实际上是常用的,并且是一种可靠的方法。

我终于偶然发现了这个:http://msdn.microsoft.com/en-us/library/gg405484%28v=PandP.40%29.aspx

这为您的视图模型提供了第一种使用数据模板的方法。