Silverlight Navigation-Silverlight页面间自定义导航
2010-07-01 13:33
423 查看
关于Silverlight Navigation导航我一直想写一篇文章总结一下在项目中实际应用. Navigation导航是关联一个应用程序中实现功能多样化最基本需求. 导航也可以详细分为应用程序导航[应用中多为Page之间],外部导航, 集成浏览器导航等. Silverlight 发展今天版本4 当然也在这个方面做出很多努力. 从1.1 2.0 NavigationService到今天出现Frame控件,导航框架等. 逐渐丰富加强这方面运用. 本篇的目的自定义一个导航帮助类 实现Silverlight 中页面间导航操作. 先看看效果[稍微有点大]:
在项目中使用 新建三个测试页面 分别命名为:NvgTestPageOne /Two/Three.xaml ,默认初始页TestPageone.xaml, 可以从TestPageone跳转Two 跳转后可以通过Back按钮返回上一页. 当然各个页面间也支持直接跳转, 整个流程如图:
实现步骤: 自定义导航帮助类-NavigationHelper
A:引用空间
B:在NavigationHelper声明变量:
C:从当前页面跳转到一个新页面:
这个方法参数就是要跳转到页面UserControl. 通过操作App.RootVisual中Grid. 把新页面作为子控件添加到Grid.Children集合中. 当然跳转后如果Back返回操作. 我们必须记录这个跳转流程在Dictionary<string, string>中. 页面间记录识别模式如下:
D:返回到上一页
BackFram如上方法参数是当前页Control 传入后在Dictionary中查找对应跳转流程上一页记录. 然后跳转. 其中获取对应各页Control利用Assembly发射原理.具体方法实现如下:
F:获得一个具体页面Control:
G:调用方式
如从Testpageone跳转到TestpageTwo页面 如下:
如果从TestPageTwo页面返回到TestpageOne 调用如下:
直接跳转就更简单 同方式一类似.
如上一个简单方式实现Silverlight页面间跳转自定义帮助类. 简便快捷.当然如上只是简单跳转.实际运用中涉及到页面间参数的传递,值状态保留等问题. 完全可以在这个基础之上加以扩展即可.关于更多的Silverlight Navigation实现方式 稍后会有介绍.
关于Silverlight Navigation项目源代码下载见附件。
附件:http://down.51cto.com/data/2359685
在项目中使用 新建三个测试页面 分别命名为:NvgTestPageOne /Two/Three.xaml ,默认初始页TestPageone.xaml, 可以从TestPageone跳转Two 跳转后可以通过Back按钮返回上一页. 当然各个页面间也支持直接跳转, 整个流程如图:
实现步骤: 自定义导航帮助类-NavigationHelper
A:引用空间
using System.Collections; using System.Collections.Generic; using System.Reflection;
B:在NavigationHelper声明变量:
//声明 private static Grid FrameGrid = new Grid();//用存储导航页面和实现操作 private static Dictionary<string, string> getFrameDic = new Dictionary<string, string>();//记录整个跳转流程
C:从当前页面跳转到一个新页面:
/// <summary> /// 跳转新页面 /// </summary> public static void NavigationFrame(UserControl sendpage) { App getcurentapp = Application.Current as App; if (getcurentapp != null) { //保存老页面 Grid rootgrid=getcurentapp.RootVisual as Grid; UserControl getoldpageCon = rootgrid.Children[0] as UserControl; //测试发现问题:SendPage.Name有可能为空. 换利用Type的属性值 //添加时注意键不能重复 bool isreply = false; foreach (KeyValuePair<string, string> getkey in NavigationHelper.NavigationHelp.getFrameDic) { if (getkey.Key.Equals(sendpage.GetType().Name + "old")) { isreply = true;//已经存在 } } if (!isreply) { NavigationHelp.getFrameDic.Add(sendpage.GetType().Name + "old", getoldpageCon.GetType().Name); } //跳转新页面 rootgrid.Children.Clear(); rootgrid.Children.Insert(0, sendpage); getcurentapp.RootVisual = rootgrid; } }
这个方法参数就是要跳转到页面UserControl. 通过操作App.RootVisual中Grid. 把新页面作为子控件添加到Grid.Children集合中. 当然跳转后如果Back返回操作. 我们必须记录这个跳转流程在Dictionary<string, string>中. 页面间记录识别模式如下:
D:返回到上一页
/// <summary> /// 自动跳转到上一页 类似IE的历史记录 /// </summary> public static void NavigationBackFrame(UserControl CurrentPage) { bool isexit = false;//是否存在上一页 或是判断是否是根目录 string backpage = string.Empty; foreach (KeyValuePair<string,string> getkey in NavigationHelp.getFrameDic) { if (getkey.Key.Equals(CurrentPage.GetType().Name+"old")) { isexit = true;//存在 backpage =getkey.Value; //MessageBox.Show(backpage); 测试成功 } } if (!string.IsNullOrEmpty(backpage)) { //返回上一页 UserControl getbackControl = NavigationHelp.NavigationGetControlByName(backpage); if (getbackControl != null) { App getcurentapp = Application.Current as App; Grid rootgrid = getcurentapp.RootVisual as Grid; //跳转 rootgrid.Children.Clear(); rootgrid.Children.Insert(0, getbackControl); getcurentapp.RootVisual = rootgrid; } } else { //不存在或是已经是根目录 MessageBox.Show("当前已经是根目录!"); } }
BackFram如上方法参数是当前页Control 传入后在Dictionary中查找对应跳转流程上一页记录. 然后跳转. 其中获取对应各页Control利用Assembly发射原理.具体方法实现如下:
F:获得一个具体页面Control:
/// <summary> /// 通过Control的名称利用反射获取 UserContol实例对象./ /// </summary> public static UserControl NavigationGetControlByName(string controlname) { //获取当前Assembly UserControl getpageControl = null; Assembly getcurrentass = Assembly.GetExecutingAssembly(); foreach (Type gettype in getcurrentass.GetTypes()) { if (gettype.Name.Equals(controlname)) { //存在该Control getpageControl = Activator.CreateInstance(gettype) as UserControl; } } return getpageControl; }
G:调用方式
如从Testpageone跳转到TestpageTwo页面 如下:
//调用导航帮助类下公开当行方法 跳转到TestpagetTwo UserControl sendpageCon=NavigationHelper.NavigationHelp.NavigationGetControlByName("NvgTestPageTwo"); NavigationHelper.NavigationHelp.NavigationFrame(sendpageCon);
如果从TestPageTwo页面返回到TestpageOne 调用如下:
//调用导航帮助类 返回记录上一页 UserControl currentControl = NavigationHelper.NavigationHelp.NavigationGetControlByName("NvgTestPageTwo"); NavigationHelper.NavigationHelp.NavigationBackFrame(currentControl);
直接跳转就更简单 同方式一类似.
如上一个简单方式实现Silverlight页面间跳转自定义帮助类. 简便快捷.当然如上只是简单跳转.实际运用中涉及到页面间参数的传递,值状态保留等问题. 完全可以在这个基础之上加以扩展即可.关于更多的Silverlight Navigation实现方式 稍后会有介绍.
关于Silverlight Navigation项目源代码下载见附件。
附件:http://down.51cto.com/data/2359685
相关文章推荐
- Silverlight Navigation-Silverlight页面间自定义导航
- silverlight 页面之间的导航汇总
- Silverlight中页面导航
- 自定义标签--页面导航
- Tip - Silverlight - 自定义初始化页面
- 自定义封装导航栏左右按钮点击事件和特定风格的控制器供多个控制器继承—— 当很多导航页面有相似的导航条时
- silverlight程序,在多页面之间进行导航
- 使Silverlight页面继承自定义BasePage类
- 如何自定义silverlight的加载页面
- Silverlight 页面导航
- silverlight for win phone页面导航
- Silverlight调用自定义的Web Service从数据库获取数据进行页面绑定
- 如何自定义silverlight的加载页面
- 如何自定义silverlight的加载页面
- Silverlight 3 页面导航
- silverlight开发实例(Prism+MVVM+RIA)(三)--创建页面导航
- react_native 项目实战 (3) 使用导航页面跳转 (ReactNaviation 完全自定义导航)
- 自定义ViewPager页面指示器(导航索引)
- 自定义页面导航控件初探
- Silverlight中的页面导航