从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1
原文:从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1
0x6Navigation
[7.1updated] Navigation 在wpf中并没有变化
Basic Navigation
Prism中的Navigation提供了一种类似导航的功能,他可以根据用户的输入,来刷新UI。
先看一个最简单的例子,通过按钮来导航到一个视图,在这里,视图被注册为Navication。
7.1中不再使用构造函数注入依赖,而是新增了两个接口OnInitialized和RegisterTypes,前面region的应用的时候,我们使用的是OnInitialized,导航这他用了RegisterTypes,代码如下,将view注册成Navication,并且注册到容器中:
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>();
containerRegistry.RegisterForNavigation<ViewB>();
}
Shell 视图中设置两个Button并且绑定下面这个带参数的命令:
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);
}
<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>
RegionManager通过RequestNavigate方法来获取已经注册的Navigation并且绑定到Region上去。
当需要根据调用结果来处理一些事情,可以使用下面这个方法:
void RequestNavigate(string regionName, string source, Action<NavigationResult> navigationCallback);
当然,上面这个方法是在Shell中调用的,但,有些时候,我们需要View或者ViewModel也参与到Navigation中来,比如当你Request一个Navigation的时候,希望navigation本身显示一些信息,为此 Prism为我们提供了一个INavigationAware 接口。
//
// Summary:
// Provides a way for objects involved in navigation to be notified of navigation
// activities.
public interface INavigationAware
{
//
// Summary:
// Called to determine if this instance can handle the navigation request.
//
// Parameters:
// navigationContext:
// The navigation context.
//
// Returns:
// true if this instance accepts the navigation request; otherwise, false.
bool IsNavigationTarget(NavigationContext navigationContext);
//
// Summary:
// Called when the implementer is being navigated away from.
//
// Parameters:
// navigationContext:
// The navigation context.
void OnNavigatedFrom(NavigationContext navigationContext);
//
// Summary:
// Called when the implementer has been navigated to.
//
// Parameters:
// navigationContext:
// The navigation context.
void OnNavigatedTo(NavigationContext navigationContext);
}
如果想要Navigation的目标也参与到Navigation的过程当中,只需要让你的viewmodel实现这个接口,然后在这些方法里编写你的代码就可以了。
IsNavigationTarget方法设置了是否被允许设置为导航的目标,当他的返回值为Fasle的时候,将不会被“导航”到它。
在
19-NavigationParticipation的例子中,Region的目标是:
<TabControl prism:RegionManager.RegionName="ContentRegion" Margin="5" />
TabControl在设置为Region的时候,加载View时会自动创建Page来存放View,如果“导航”到同一个View他会在Page中找到他,并且显示出来。但如果IsNavigationTarget返回False的话,就不会显示之前的Page而是创建了一个新的Page来加载View。
PassingParameters带参数的导航
使用Navigation的时候,将数据源带到新的NavigationTarget中去,然后Target应用这些数据。这将使用到navigation的NavigationContext参数:
private void PersonSelected(Person person)
{
var parameters = new NavigationParameters();
parameters.Add("person", person);
if (person != null)
_regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetail", parameters);
}
在Target的OnNavigatedTo方法中使用:
public void OnNavigatedTo(NavigationContext navigationContext)
{
var person = navigationContext.Parameters["person"] as Person;
if (person != null)
SelectedPerson = person;
}
当导航变更的时候你需要一些提示框,需要实现IConfirmNavigationRequest
他有一个ConfirmNavigationRequest方法来进行一些判断。
在上面的例子中,我们在view之间跳转的时候,viewA 和viewB是被缓存的,但是有时候,我们跳转到B的时候想要销毁A,怎么来做呢?
在View或ViewModel上实现IRegionMemberLifetime接口,并将KeepAlive属性的值设置为false。
journal
journal 实现一种类似浏览器前进后退按钮一样的效果,当一个region 有多个view的时候,他会自动记录view的加载顺序,然后在view之间来回切换。
Prism中是通过IRegionNavigationJournal来实现的,在视图加载时,讲道理,可以无限级前进和后退的,我自己在官方的例子上加了一个视图也完美运行。
public void OnNavigatedTo(NavigationContext navigationContext)
{
_journal = navigationContext.NavigationService.Journal;
}
然后使用 :
_journal.GoBack();
或者
_journal.GoForward();
从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1的更多相关文章
- 从PRISM开始学WPF(八)导航Navigation?
原文:从PRISM开始学WPF(八)导航Navigation? 0x6Navigation Basic Navigation Prism中的Navigation提供了一种类似导航的功能,他可以根据用户 ...
- 从PRISM开始学WPF,Prism7更新了什么
当时我在搬运Prism6.3的sample代码的时候,就是因为网上的资料太老旧,万万没想到这给自己挖了一个坑,因为我在做笔记的时候,prism已经在更新7.0了 现在已经是7.2了,(lll¬ω¬), ...
- 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1
原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1 事件聚合器EventAggregator [7.1updated]除了app部分,没 ...
- 从PRISM开始学WPF(一)WPF-更新至Prism7.1
原文:从PRISM开始学WPF(一)WPF-更新至Prism7.1 我最近打算学习WPF ,在寻找MVVM框架的时候发现了PRISM,在此之前还从一些博客上了解了其他的MVVM框架,比如浅谈WPF中的 ...
- 从PRISM开始学WPF(一)WPF?
从PRISM开始学WPF(一)WPF? 我最近打算学习WPF ,在寻找MVVM框架的时候发现了PRISM,在此之前还从一些博客上了解了其他的MVVM框架,比如浅谈WPF中的MVVM框架--MVVM ...
- 从PRISM开始学WPF(番外)共享上下文 RegionContext?
原文:从PRISM开始学WPF(番外)共享上下文 RegionContext? RegionContext共享上下文 There are a lot of scenarios where you mi ...
- 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator?
原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WP ...
- 从PRISM开始学WPF(六)MVVM(三)事件聚合器EventAggregator?
从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...
- 从PRISM开始学WPF(八)導航Navigation?
0x6Navigation Basic Navigation Prism中的Navigation提供了一种类似导航的功能,他可以根据用户的输入,来刷新UI. 先看一个最简单的例子,通过按钮来导航到一个 ...
随机推荐
- 分享上传图片shell的绕过过滤的几种方法
一般网站图片上传功能都对文件进行过滤,防止webshell写入.但不同的程序对过滤也不一样,如何突破过滤继续上传? 本文总结了七种方法,可以突破! 1.文件头+GIF89a法.(php)//这个很好理 ...
- (转)tcp的半连接与完全连接队列
队列及参数 tcp-sync-queue-and-accept-queue-small.jpg server端的半连接队列(syn队列) 在三次握手协议中,服务器维护一个半连接队列,该队列为每个客 ...
- Hibernate关于父类子类的映射
怕忘记,把栗子贴上来 以Person类和Student类为例 public class Person { private Integer id; private String name; privat ...
- web项目脱离Eclipse在Tomcat部署并配置Eclipse调试
简单来说,把WEB项目打成war包后放到webapps目录下启动tomcat便部署成功了,但是因为与Eclipse没有关联,故而无法Debug调试代码.这时在Tomcat的catalina.sh脚本里 ...
- Unity3D Shaderlab 学习记录
unity3d 定制的表面着色器(Surface Shader)的标准输出结构是这种: struct SurfaceOutput { half3 Albedo; //反射率 half3 Norm ...
- JQuery获取和设置Select选项的常用方法总结
1.获取select 选中的 text: $("#cusChildTypeId").find("option:selected").text(); $(&q ...
- Libevent源码学习笔记一:event2/event.h
一.libevent标准使用方法: 每个程序使用Libevent必须include <event2/event.h> 头文件,并 传给 -levent 链接器.如果只是想使用主要的eve ...
- ui-element消息类型 MessageBox 弹框 type类型
MessageBox 弹框 type字段表明消息类型,可以为success,error,info和warning
- Windows 使用iCloud日历
作者:Lumos Night链接:https://www.zhihu.com/question/34287617/answer/97299386来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- oracle 导出空表问题
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0