Bootstrap

WPF在MVVM模式下怎么实现导航功能

在mvvm的模式下wpf通过frame实现页面跳转_哔哩哔哩_bilibili

视频讲解同步可观看

如下图,我们要实现点击左侧的菜单,在右侧展示不同的页面

实现代码如下:

一、如何从主窗体跳转到页面。

1、在mainwindow.xaml的菜单栏代码里加入如下代码

  1.  <Border BorderBrush="#3c5254" BorderThickness="3">
  2.      <Button
  3.          Margin="0,3"
  4.          HorizontalAlignment="Stretch"
  5.          Background="#2f3366"
  6.          Command="{Binding NavigateToPageCommand}"
  7.          CommandParameter="Pages/DragPage.xaml"
  8.          Content="控件拖拉拽"
  9.          Cursor="Hand"
  10.          Foreground="White" />
  11.  </Border>

2、在mainwindows.xaml里添加一段代码里加一个导航容器,用于加载、显示和缓存页面,一般是page对像。

  1.  <Frame
  2.      Name="MainFrame"
  3.      Grid.Row="1"
  4.      NavigationUIVisibility="Visible" />

3、在MainWindows.xaml.cs隐藏代码里做如下处理,把2中的frame通过构造函数的方式传到viewmodel中,这段代码放到默认构造函数中

  1.  DataContext = new MainWindowViewModel(this.MainFrame);
  2.  //注册页面加载完成事件
  3.  this.Loaded += MainWindow_Loaded;

4、实现主页面加载方法。

  1.  private void MainWindow_Loaded(object sender, RoutedEventArgs e)
  2.  {
  3.      //在页面加载完成之后跳转到Pages/MainPage.xaml
  4.      MainFrame.Navigate(new Uri("Pages/MainPage.xaml", UriKind.Relative));
  5.  }

6、在viewmodel中实现通过构造函数接收Frame

  1.    public MainWindowViewModel(Frame frame)
  2.    {
  3.        _frame = frame;
  4.    }

7、实现通用的页面跳转方法

  1.     private ICommand _navigateToPageCommand;
  2.     public ICommand NavigateToPageCommand
  3.     {
  4.         get
  5.         {
  6.             return _navigateToPageCommand ?? new RelayCommand(NavigateToPage,null);
  7.         }
  8.     }
  9.     private void NavigateToPage(object? page)
  10.     {
  11.         try
  12.         {
  13.             string pageUri = page as string;
  14.             if (pageUri != null)
  15.                 _frame.Navigate(new Uri(pageUri, UriKind.Relative));
  16.         }
  17.         catch (Exception ex)
  18.         {
  19.         }
  20.       
  21.     }

;