【问题标题】:Switching Between Screens WPF在屏幕之间切换 WPF
【发布时间】:2012-10-12 15:16:35
【问题描述】:

我是使用 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?

所以我真的只是想知道上述哪种方法是我应该前进的方向?我实际上已经实现了第一个答案,但我不确定这样做是否是对数据模板的“滥用”/“黑客”,或者是否应该这样使用框架。

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

谢谢,

【问题讨论】:

  • 这实际上正是 WPF 应该如何工作的 :) 您的应用程序由您创建的对象(ViewModels/Models)组成,并且您使用 DataTemplates 和 UI 对象来告诉 WPF 如何绘制您的应用程序。这与 WinForms 正好相反,在 WinForms 中,您使用 UI 对象构建应用程序,并为它们提供所需的数据。
  • 我引用的第二个答案的导航功能是什么?
  • 我之前没有使用过该代码,但它似乎是一个完成同样事情的框架。您将一个对象设置为“当前”页面,它使用ViewModelLocator 来定位正确的视图来绘制页面。
  • 我明白了,感谢您提供的信息。如果您不介意,还有一个问题:您如何使用您的方法处理过渡效果?
  • 我会从视图中处理它们,因为它们是视图特定的函数。我可能会在代码隐藏中附加一些东西来监听变化,并在发生变化时运行一些动画。最简单的方法可能是订阅 ViewModel 的 PropertyChange 事件,尽管我确信还有其他方法可以做到这一点,例如使用消息传递系统。

标签: wpf mvvm-light


【解决方案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>     

【讨论】:

  • 谢谢,我已经按照我链接的第一个答案实现了这个。我想知道为什么这比第二个答案更受欢迎,这是正确的方法。
  • 在 MVVM Light 工具包上,您使用的第三方库不是 wpf 框架的一部分,我认为在框架之上实现更有好处,因为您可以维护自己的代码并且还您可以更清楚地了解框架的工作原理。
【解决方案2】:

我在这个问题中真正寻找的是一个参考,该参考表明我列出的两种方法中的一种实际上是常用的并且是一种可靠的方法。

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

这是为视图模型使用数据模板的第一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多