声明
原文出处如下:
这是一篇记录作者学习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-》如何使用基本区域导航
-
将view注册成Navication,并且注册到容器中
public void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<ViewA>(); containerRegistry.RegisterForNavigation<ViewB>(); }
-
设置带参数的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); }
-
RegionManager通过RequestNavigate方法来获取已经注册的Navigation并且绑定到Region上去
//当需要根据调用结果来处理一些事情,可以使用下面这个方法 void RequestNavigate(string regionName, string source, Action<NavigationResult>
Navigation Callback-》导航完成后获取通知
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);
}
- 实现INavigationAware接口,为导航中涉及的对象提供导航通知的方法
- 实现对应的方法
导航期间控制视图实例
- 实现INavigationAware接口,为导航中涉及的对象提供导航通知的方法
- 实现对应的方法
将参数从View / ViewModel传递到另一个View / ViewModel
// 摘要:
// 此方法允许IRegionManager定位指定区域并导航
// 在其中向指定的目标字符串传递一个NavigationParameters实例,
// 保存对象参数的集合。
//
// 参数:
// regionName:
// 导航将要出现的区域的名称。
//
// target:
// 表示区域将导航到的目标的字符串。
//
// navigationParameters:
// NavigationParameters的一个实例,它保存一个对象参数集合。
void RequestNavigate(string regionName, string target, NavigationParameters navigationParameters);
使用IConfirmNavigationReqest界面确认或取消导航
- 实现IConfirmNavigationRequest接口
- ConfirmNavigationRequest进行判断
摘要:
// 确定该实例是否接受导航离开。
//
// 参数:
// NavigationContext:
// 导航上下文。
//
// continuationCallback:
// 指示导航何时可以继续的回调。
//
// 言论:
// 此方法的实现者不需要在此方法之前调用回调函数
// 完成,但必须确保回调最终被调用。
void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback);
使用IRegionMemberLifetime自动从内存中删除视图
- 实现IRegionMemberLifetime接口
- 并将KeepAlive属性的值设置为false
//
// 摘要:
// 在实现时,允许将实例放置在Prism.Regions中。IRegion使用
// Prism.Regions.Behaviors。RegionMemberLifetimeBehavior表示它应该
// 当它从激活状态转换为非激活状态时删除。
public interface IRegionMemberLifetime
{
//
// 摘要:
// 获取一个值,该值指示在停用时此实例是否应保持活动状态。
bool KeepAlive { get; }
}
//案例
public bool KeepAlive
{
get
{
return false;
}
}
了解如何使用导航日志
- Prism中是通过IRegionNavigationJournal来实现的
- journal 实现一种类似浏览器前进后退按钮一样的效果,当一个region 有多个view的时候,他会自动记录view的加载顺序,然后在view之间来回切换
//
// 摘要:
// 提供区域内的当前、后退和前进导航日志。
public interface IRegionNavigationJournal
//案例
public void OnNavigatedTo(NavigationContext navigationContext)
{
_journal = navigationContext.NavigationService.Journal;
}
_journal.GoBack();
_journal.GoForward();