Prism Demo系列(十七) Prism架构剖析:17-BasicRegionNavigation

一、简介

Region结合Navigation导航,类似https://blog.csdn.net/xpj8888/article/details/83022627的功能。

关于导航,请参考:https://www.cnblogs.com/sunrfun/archive/2013/03/24/2979702.html

  • IsNavigationTarget方法:当前的视图模型是否可以处理请求的导航行为,通常用来指定当前的视图/模型是否可以重用。例如,一个显示客户明细的视图可以显示客户a,客户b....等的信息,他们重用同一个视图。
  • OnNavigatedTo方法:当前的页面被导航到以后发生,这个函数可以用来处理URI的参数。
  • OnNavigatedFrom方法:当前的页面导航到其他页面的时候发生。

二、举例

1、BasicRegionNavigation工程

1.1、App.xaml、App.xaml.cs、MainWindow.xaml.cs(与之前的相同)。

1.2、Bootstrapper.cs:

using Microsoft.Practices.Unity;
using Prism.Unity;
using BasicRegionNavigation.Views;
using System.Windows;
using Prism.Modularity;
using ModuleA;

namespace BasicRegionNavigation
{
    class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void InitializeShell()
        {
            Application.Current.MainWindow.Show();
        }

        protected override void ConfigureModuleCatalog()
        {
            var catalog = (ModuleCatalog)ModuleCatalog;
            catalog.AddModule(typeof(ModuleAModule));
        }
    }
}

1.3、MainWindow.xaml:

<Window x:Class="BasicRegionNavigation.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">
    <DockPanel LastChildFill="True">
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="5" >
            <Button Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5">Navigate to View A</Button>
            <Button Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5">Navigate to View B</Button>
        </StackPanel>
        <ContentControl prism:RegionManager.RegionName="ContentRegion" Margin="5"  />
    </DockPanel>
</Window>

1.4、MainWindowViewModel.cs:

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

namespace BasicRegionNavigation.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager _regionManager;

        private string _title = "Prism Unity Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        public DelegateCommand<string> NavigateCommand { get; private set; }

        public MainWindowViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;

            NavigateCommand = new DelegateCommand<string>(Navigate);//一旦点击按钮,会将CommandParameter传递进来。
        }

        /// <summary>
        /// //一旦点击按钮,会将CommandParameter传递给navigatePath,并执行Navigate。
        /// </summary>
        /// <param name="navigatePath"></param>
        private void Navigate(string navigatePath)
        {
            if (navigatePath != null)
                _regionManager.RequestNavigate("ContentRegion", navigatePath); //ContentRegion这个区域显示ViewA或ViewB
        }
    }
}

2、ModuleA项目

2.1、ViewAViewModel.cs、ViewBViewModel.cs、ViewA.xaml.cs、ViewB.xaml.cs(采用默认值,空的,没有写任何东西)。

2.2、ModuleAModule.cs:

using Microsoft.Practices.Unity;
using ModuleA.Views;
using Prism.Modularity;
using Prism.Regions;
using Prism.Unity;
using System;

namespace ModuleA
{
    public class ModuleAModule : IModule
    {
        IRegionManager _regionManager;
        IUnityContainer _container;

        public ModuleAModule(RegionManager regionManager, IUnityContainer container)
        {
            _regionManager = regionManager;
            _container = container;
        }

        public void Initialize()
        {
            _container.RegisterTypeForNavigation<ViewA>();
            _container.RegisterTypeForNavigation<ViewB>();
        }
    }
}

2.3、ViewA.xaml或ViewB.xaml:

<UserControl x:Class="ModuleA.Views.ViewA"
             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">
    <Grid>
        <TextBlock Text="ViewA" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</UserControl>

3、效果图:

4、流程图:

猜你喜欢

转载自blog.csdn.net/xpj8888/article/details/86549855