16-24 Navigation-导航

声明

原文出处如下:

作者:RyzenAdorer 内容简介:Prism医疗案例

作者:可是我爱你啊 内容简介:Prism官方案例的学习分享

Prism官网开发文档

容器相关知识的学习

Microsoft官方文档

这是一篇记录作者学习Prism的随笔,该随笔的内容是作者通过5个资源学习汇总而成,主要是为了方便自己以后拾遗温习所用,如果文中内容看不懂,推荐直接阅读相关原文。

16-24 Navigation-》导航

RegionContext-》使用RegionContext将数据传递到嵌套区域

<ContentControl Grid.Row="1" Margin="10"
prism:RegionManager.RegionName="PersonDetailsRegion"
prism:RegionManager.RegionContext="{Binding SelectedItem, ElementName=_listOfPeople}"/>

Region Navigation-》如何使用基本区域导航

  1. 将view注册成Navication,并且注册到容器中

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
      containerRegistry.RegisterForNavigation<ViewA>();
      containerRegistry.RegisterForNavigation<ViewB>();
    }
    
  2. 设置带参数的Command命令

    //xaml
    <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>
    //cs
    private readonly IRegionManager _regionManager;
    public DelegateCommand<string> NavigateCommand { get; private set; }
    public MainWindowViewModel(IRegionManager regionManager)
    {
    _regionManager = regionManager;
    NavigateCommand = new DelegateCommand<string>(Navigate);
    }
    private void Navigate(string navigatePath)
    {
    if (navigatePath != null)
    _regionManager.RequestNavigate("ContentRegion", navigatePath);
    }
    
  3. RegionManager通过RequestNavigate方法来获取已经注册的Navigation并且绑定到Region上去

    //当需要根据调用结果来处理一些事情,可以使用下面这个方法
    void RequestNavigate(string regionName, string source, Action<NavigationResult> 
    
 private void Navigate(string navigatePath)
{
if (navigatePath != null)
_regionManager.RequestNavigate("ContentRegion", navigatePath, NavigationComplete);
}
private void NavigationComplete(NavigationResult result)
{
System.Windows.MessageBox.Show(String.Format("Navigation to {0} complete. ", result.Context.Uri));
}

RequestNavigate

 /// <summary>
/// 导航指定的区域管理器
/// </summary>
/// <param  name="regionName">要调用导航的区域的名称</param>
/// <param name="source">要显示内容的URI</param>
/// <param name="navigationCallback">导航的回调方法</param>
void RequestNavigate(string regionName, string source, Action<NavigationResult> 

通过INavigationAware了解有关View和ViewModel导航参与的信息

如果需要View或者ViewModel也参与到Navigation中来,比如当你Request一个Navigation的时候,希望navigation本身显示一些信息,为此 Prism为我们提供了一个INavigationAware 接口。

	//
    // 总结:
    //     为导航中涉及的对象提供导航通知的方法
    //     活跃.
    public interface INavigationAware
    {
        //
        // 总结:
        //     调用以确定此实例是否可以处理导航请求。
        //
        // 参数:
        //   导航上下文:
        //     导航上下文.
        //
        // 返回:
        //    如果该实例接受导航请求,则为true;否则,假的。
        bool IsNavigationTarget(NavigationContext navigationContext);
        //
        // 总结:
        //    当导航离开实现者时调用。
        //
        // 参数:
        //   导航上下文:
        //     导航上下文.
        void OnNavigatedFrom(NavigationContext navigationContext);
        //
        // 总结:
        //     当导航到实现时调用。
        //
        // 参数:
        //   导航上下文:
        //     导航上下文.
        void OnNavigatedTo(NavigationContext navigationContext);
    }
  1. 实现INavigationAware接口,为导航中涉及的对象提供导航通知的方法
  2. 实现对应的方法

导航期间控制视图实例

  1. 实现INavigationAware接口,为导航中涉及的对象提供导航通知的方法
  2. 实现对应的方法

将参数从View / ViewModel传递到另一个View / ViewModel

     // 摘要:
        //    此方法允许IRegionManager定位指定区域并导航
        //    在其中向指定的目标字符串传递一个NavigationParameters实例,
        //    保存对象参数的集合。
        //
        // 参数:
        //   regionName:
        //    导航将要出现的区域的名称。
        //
        //   target:
        //    表示区域将导航到的目标的字符串。
        //
        //   navigationParameters:
        //    NavigationParameters的一个实例,它保存一个对象参数集合。
        void RequestNavigate(string regionName, string target, NavigationParameters navigationParameters);

使用IConfirmNavigationReqest界面确认或取消导航

  1. 实现IConfirmNavigationRequest接口
  2. ConfirmNavigationRequest进行判断
 摘要:
        //    确定该实例是否接受导航离开。
        //
        // 参数:
        //   NavigationContext:
        //     导航上下文。
        //
        //   continuationCallback:
        //    指示导航何时可以继续的回调。
        //
        // 言论:
        //    此方法的实现者不需要在此方法之前调用回调函数
        //    完成,但必须确保回调最终被调用。
        void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback);

使用IRegionMemberLifetime自动从内存中删除视图

  1. 实现IRegionMemberLifetime接口
  2. 并将KeepAlive属性的值设置为false
 //
    // 摘要:
    //     在实现时,允许将实例放置在Prism.Regions中。IRegion使用
    //     Prism.Regions.Behaviors。RegionMemberLifetimeBehavior表示它应该
    //     当它从激活状态转换为非激活状态时删除。
    public interface IRegionMemberLifetime
    {
        //
        // 摘要:
        //     获取一个值,该值指示在停用时此实例是否应保持活动状态。
        bool KeepAlive { get; }
    }

//案例

        public bool KeepAlive
        {
            get
            {
                return false;
            }
        }

了解如何使用导航日志

  1. Prism中是通过IRegionNavigationJournal来实现的
  2. journal 实现一种类似浏览器前进后退按钮一样的效果,当一个region 有多个view的时候,他会自动记录view的加载顺序,然后在view之间来回切换
//
// 摘要:
//     提供区域内的当前、后退和前进导航日志。
public interface IRegionNavigationJournal

//案例
public void OnNavigatedTo(NavigationContext navigationContext)
        {
            _journal = navigationContext.NavigationService.Journal;
        }
_journal.GoBack();
_journal.GoForward();
posted @ 2020-08-10 01:51  AJun816  阅读(364)  评论(0)    收藏  举报