学海无涯

导航

导航 IRegionManager

 

<Window x:Class="PrismWpfBlankApp.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Margin="10" Orientation="Horizontal">
            <Button  Margin="10" Command="{Binding GoBackCommand}" Content="上一页"></Button>
            <Button  Margin="10" Command="{Binding GoForwardCommand}" Content="下一页"></Button>
            <Button  Margin="10" Command="{Binding OpenACommand}" Content="打开A"></Button>
            <Button  Margin="10" Command="{Binding OpenBCommand}" Content="打开B"></Button>

        </StackPanel>
        
        <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion"/>
        
    </Grid>
</Window>

  

using DryIoc;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using PrismWpfBlankApp.Views;
using System.Net.NetworkInformation;

namespace PrismWpfBlankApp.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager m_RegionManager;
        private IRegionNavigationJournal m_Journal;//导航日志
        private string _title = "Prism Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        public MainWindowViewModel(IRegionManager regionManager)
        {
            m_RegionManager = regionManager;
            GoBackCommand = new DelegateCommand(GoBack);
            GoForwardCommand = new DelegateCommand(GoForward);
            OpenACommand = new DelegateCommand(OpenA);
            OpenBCommand = new DelegateCommand(OPenB);
        }
        public DelegateCommand GoBackCommand { get; }
        public DelegateCommand GoForwardCommand { get; }
        public DelegateCommand OpenACommand { get; }
        public DelegateCommand OpenBCommand { get; }
        private void OpenA()
        {//导航到 ViewA 视图并传递参数
            NavigationParameters param = new NavigationParameters();
            param.Add("Value", "Hello");
            m_RegionManager.RequestNavigate("ContentRegion", "PageA", arg =>
            {
                m_Journal = arg.Context.NavigationService.Journal;
            }, param);

            //或者使用 Http 方式,传递参数
            //m_RegionManager.RequestNavigate("ContentRegion", "PageA?Value=Hello 来自查询参数");
        }
        private void OPenB()
        {//导航到 ViewB 视图
            m_RegionManager.RequestNavigate("ContentRegion", nameof(ViewB), arg =>
            {
                m_Journal = arg.Context.NavigationService.Journal;
            });
        }
        private void GoBack()
        {
            m_Journal.GoBack();
        }
        private void GoForward()
        {
            m_Journal.GoForward();
        }
    }
}

  

using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismWpfBlankApp.ViewModels
{
    public class ViewAViewModel : BindableBase, IConfirmNavigationRequest
    {//INavigationAware 用于导航传递参数
        //IConfirmNavigationRequest 导航离开前确认,IConfirmNavigationRequest 继承INavigationAware
        private string message;

        public string Message
        {
            get { return message; }
            set { SetProperty(ref message, value); }
        }
        #region 接口实现
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {//确认导航请求,离开当前视图前弹出提示框,以便保存未保存的数据
            bool result = true;
            if (MessageBox.Show("是否要离开ViewA", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK)
            {
                result = false;
            }
            continuationCallback?.Invoke(result);
        }

        /// <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)
        {//新视图
            var value = navigationContext.Parameters.GetValue<string>("Value");
            if (string.IsNullOrEmpty(value) == false)
            {
                Message = value.ToString();
            }
        }
        #endregion 
    }
}

 在App中注册导航视图:

/// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

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

  

 

posted on 2023-01-01 11:38  宁静致远.  阅读(46)  评论(0编辑  收藏  举报