Navigation区域导航

Navigation区域导航

功能实现

这里以实现按钮打开A和打开B为例

首先创建ViewA和ViewB的页面

Navigation区域导航

在App.xaml.cs中实现对页面的注册

 protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<ViewA>("PageA");
    containerRegistry.RegisterForNavigation<ViewB>();
}

在MainWindowViewModel中实现对区域内容的设置。以打开A为例,创建按钮,然后实现打开A的函数功能。

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;

namespace BlankCoreApp1.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager regionManager;

        public DelegateCommand OpenACommand { get; private set; }

        public MainWindowViewModel(IRegionManager regionManager)
        {
            OpenACommand = new DelegateCommand(OpenA);
            this.regionManager = regionManager;
        }

        private void OpenA()
        {
            // 设置区域内容为PageA的内容
            regionManager.RequestNavigate("ContentRegion", "PageA", param);
            
        }
    }
}

实现参数传递

创建一个ViewAViewModel.cs的类,用来实现对ViewA页面参数的传递

Navigation区域导航

其中可以实现以下接口

using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Text;

namespace BlankCoreApp1.ViewModels
{

    public class ViewAViewModel : BindableBase, INavigationAware
    {

        /// <summary>
        /// 判断是否需要重新创建一个新的实例
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <returns></returns>
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        /// <summary>
        /// 导航离开当前页时触发
        /// </summary>
        /// <param name="navigationContext"></param>
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            
        }

        /// <summary>
        /// 导航完成前接收用户传递的参数以及是否允许导航等控制
        /// </summary>
        /// <param name="navigationContext"></param>
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
        
        }
    }
}

在MainWindowViewModel.cs中的OpenA函数中实现对参数的传递。这里使用NavigationParameters来创建一个param参数,使用键值对的方式把键值添加进去,使用regionManager.RequestNavigate传递参数。

private void OpenA()
{
    // 传递参数 通过RequestNavigate来把param参数传递过去,通过navigationContext来接收参数的值
    NavigationParameters param = new NavigationParameters();
    param.Add("Value", "Hello");

    // 设置区域内容为PageA的内容
    regionManager.RequestNavigate("ContentRegion", "PageA", param);
    
    //传递参数的另一种写法
    // regionManager.RequestNavigate("ContentRegion", $"PageA?Value=Hello");
}

然后通过ViewModel中的navigationContext来接收参数的值。

private string title;
public string Title
{
    get { return title; }
    set { title = value;RaisePropertyChanged(); }
}

public void OnNavigatedTo(NavigationContext navigationContext)
{
    // 接收键值为Value的值
   Title = navigationContext.Parameters.GetValue<string>("Value");
}

实现弹窗提醒

使用IConfirmNavigationRequest接口来实现。在ViewAViewModel.cs中继承该类,使用其中的

ConfirmNavigationRequest方法来实现

public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
    bool result = true;
    if(MessageBox.Show("确认导航?","温馨提示",MessageBoxButton.YesNo) == MessageBoxResult.No)
    {
        result =  false;
    }
    continuationCallback(result);
}

导航日志

使用IRegionNavigationJournal来实现导航日志的接口。接口实现了GoForward和GoBack方法。

在OpenA或者OpenB中使用arg调用回调函数来实现日志获取。

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;

namespace BlankCoreApp1.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager regionManager;
        IRegionNavigationJournal journal; // 导航日志的接口

        public DelegateCommand OpenACommand { get; private set; }
        public DelegateCommand OpenBCommand { get; private set; }
        public DelegateCommand GoBackCommand { get; private set; }
        public DelegateCommand GoForwordCommand { get; private set; }

        public MainWindowViewModel(IRegionManager regionManager)
        {
            OpenACommand = new DelegateCommand(OpenA);
            OpenBCommand = new DelegateCommand(OpenB);
            GoBackCommand = new DelegateCommand(GoBack);
            GoForwordCommand = new DelegateCommand(GoForword);
            this.regionManager = regionManager;
        }

        private void GoForword()
        {
            journal.GoForward();
        }

        private void GoBack()
        {
            journal.GoBack();
        }

        private void OpenB()
        {
            // 设置区域内容为ViewB的内容。 使用回调函数arg来拿到导航日志
            regionManager.RequestNavigate("ContentRegion", "ViewB", arg =>
            {
                journal = arg.Context.NavigationService.Journal;
            });
        }

        private void OpenA()
        {
            // 传递参数 通过RequestNavigate来把param参数传递过去,通过navigationContext来接收参数的值
            NavigationParameters param = new NavigationParameters();
            param.Add("Value", "Hello");


            // 设置区域内容为PageA的内容 使用回调函数arg来拿到导航日志
            regionManager.RequestNavigate("ContentRegion", "PageA",arg=> 
            {
                journal = arg.Context.NavigationService.Journal;
            }, param);
            
            //传递参数的另一种写法
            // regionManager.RequestNavigate("ContentRegion", $"PageA?Value=Hello");
        }
    }
}

上一篇:条款30:熟悉完美转发的失败情形


下一篇:Java实现数据结构中的八种排序方法,海康java面试几轮