使用导航日志
NavigationContext类提供了对区域导航服务的访问,该服务负责协调区域内导航期间的操作顺序。它提供了对正在进行导航的区域以及与该区域所关联的导航日志的访问。区域导航服务实现了IRegionNavigationService接口,其定义如下。
public interface IRegionNavigationService : INavigateAsync
{
IRegion Region {get; set;}
IRegionNavigationJournal Journal {get;}
event EventHandler<RegionNavigationEventArgs> Navigating;
event EventHandler<RegionNavigationEventArgs> Navigated;
event EventHandler<RegionNavigationFailedEventArgs> NavigationFailed;
}
由于区域导航服务实现了INavigateAsync接口,您可以通过调用其RequestNavigate方法在父区域内启动导航。启动导航操作时会引发Navigating事件。区域内导航完成时会引发Navigated事件。如果在导航期间遇到错误,则会引发NavigationFailed事件。
Journal属性提供对与该区域关联的导航日志的访问。导航日志实现了IRegionNavigationJournal接口,其定义如下。
public interface IRegionNavigationJournal
{
bool CanGoBack { get; }
bool CanGoForward { get; }
IRegionNavigationJournalEntry CurrentEntry { get; }
INavigateAsync NavigationTarget { get; set; }
void Clear();
void GoBack();
void GoForward();
void RecordNavigation(IRegionNavigationJournalEntry entry);
}
您可以在导航期间通过被调用的OnNavigatedTo方法中获取并存储对区域导航服务的引用。默认情况下,Prism提供一个简单的基于堆栈的日志,并允许您在一个区域内向前或向后导航。
您可以使用导航日志来允许用户在视图内进行导航。在下面的示例中,视图模型实现了一个GoBack命令,该命令使用了宿主区域内的导航日志。因此您可以在该视图中显示一个允许用户轻松导航回到该区域内的前一个视图的Back按钮。同样您也可以执行GoForward命令来实现向导式工作流。
public class EmployeeDetailsViewModel : INavigationAware
{
...
private IRegionNavigationService navigationService;
public void OnNavigatedTo(NavigationContext navigationContext)
{
navigationService = navigationContext.NavigationService;
}
public DelegateCommand<object> GoBackCommand { get; private set; }
private void GoBack(object commandArg)
{
if (navigationService.Journal.CanGoBack)
{
navigationService.Journal.GoBack();
}
}
private bool CanGoBack(object commandArg)
{
return navigationService.Journal.CanGoBack;
}
}
如果需要在某个区域内实现特定的工作流模式,则可以为该区域实现自定义导航日志。
注意: 导航日志只能用于基于区域的导航操作,且导航操作由区域导航服务进行协调。如果你使用视图发现(View Discovery)或视图注入(View Injection)在一个区域内实现导航,导航日志将不会在导航期间进行更新,并且也不能在该区域内用来向前和向后导航。
选择退出导航日志
在使用导航日志时,显示中间页面(如启动画面、加载页面或对话框)可能会很有用。此时我们不希望在调用IRegionNavigationJournal.GoForward()或IRegionNavigationJournal.GoBack()时重新访问这些页面。此种行为可以通过实现IJournalAware接口来实现。
public interface IJournalAware
{
bool PersistInHistory();
}
通过在View或ViewModel上实现IJournalAware接口并从**PersistInHistory()**返回false,可以选择不将页面添加到导航日志的历史记录中。
public class IntermediaryPage : IJournalAware
{
public bool PersistInHistory() => false;
}