博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
页面导航
阅读量:6825 次
发布时间:2019-06-26

本文共 4749 字,大约阅读时间需要 15 分钟。

windows phone页面导航可以通过两种方法进行设置:一种是直接在XAML中设置;另一种则需要通过编码在托管代码中实现。二者相同的地方是它们最终都需要使用NavigationService类,再调用Navigate方法实现导航。

1、在XAML中设置导航

最简单直接的方式,找到控件,为属性NavigateUri赋值即可,以常用的HyperlinkButton为例:

其中,使用“/”意味着这是一个相对链接,Silverlight for Windows Phone目录层次的路径操作比较严格,如将前面的“/”去掉,编译器将报错并停止运行。

 

2、托管代码中设置导航

(1)、直接传入URI

void lbtnPicture_Click(object sender, RoutedEventArgs e)        {            NavigationService.Navigate(new Uri("/View/Pictures.xaml", UriKind.Relative));        }

(2)、使用地址别名

地址别名是web技术中的一项很好的扩展,windows phone开发中同样适用。可以将较长命名的URI缩短为一段较短且好记的URI来呈现,比如将/View/Pictures.xaml缩短为Pic:

void lbtnPicture_Click(object sender, RoutedEventArgs e)        {            NavigationService.Navigate(new Uri("Pic", UriKind.Relative));        }

看到“Pic”大家会想到它一定映射到具体的某个URI(“/View/Pictures.xaml”)。如何进行映射呢?

需要在App.xaml.cs文件中额外引入UriMapper别名,映射所在的命名空间如下所示:

xmlns:navigation="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone"

 

实现地址别名,是基于Microsoft.Phone链接库的,接着就是配置对应的映射关系:

接着,我们要在App.xaml.cs的构造函数中获取地址别名,将地址别名的key提取到UriMapper对象中:

UriMap        ///         /// Constructor for the Application object.        ///         public App() { // Global handler for uncaught exceptions. UnhandledException += Application_UnhandledException; // Show graphics profiling information while debugging. if (System.Diagnostics.Debugger.IsAttached) { // Display the current frame rate counters. Application.Current.Host.Settings.EnableFrameRateCounter = true; // Show the areas of the app that are being redrawn in each frame. //Application.Current.Host.Settings.EnableRedrawRegions = true; // Enable non-production analysis visualization mode, // which shows areas of a page that are being GPU accelerated with a colored overlay. //Application.Current.Host.Settings.EnableCacheVisualization = true; } // Standard Silverlight initialization InitializeComponent(); // Phone-specific initialization InitializePhoneApplication(); this.RootFrame.UriMapper = Resources["UriMap"] as UriMapper; //将地址别名的key提取到UriMapper对象中 }

 

3、页面间传参

有过web开发经验的应该很清楚web开发中几种常见的页面参数传递方式。Silverlight for Windows Phone导航参数的传递非常类似于web开发中的get方式,也就是QueryString的方式。

下面以一个WebBrowser页面来讲解下页面间QueryString的传参方式:

//导航到浏览器页面        void btnWebBrowser_Click(object sender, RoutedEventArgs e)        {            NavigationService.Navigate(new Uri("/View/WebBrowser.xaml?uri=http://www.cnblogs.com", UriKind.Relative));        }

如果觉得参数太长,可以使用地址别名的方式:

//导航到浏览器页面        void btnWebBrowser_Click(object sender, RoutedEventArgs e)        {            NavigationService.Navigate(new Uri("Web/http://www.cnblogs.com", UriKind.Relative));        }

相应的,App.xaml文件中UriMapper代码做出适当修改:

其中,{weburi}变量称为参数变量,它是代替真实地址别名化后传递的参数值。

我们接着在WebBrowser.xaml页面拖拽一个WebBrowser控件和一个提示文本框控件,用于显示,xaml如下:

WebBrowser    

 

接着在后台代码中编写:

QueryStringusing System;using System.Windows;using System.Windows.Navigation;using Microsoft.Phone.Controls;namespace NavigationService_ch.View{    public partial class WebBrowser : PhoneApplicationPage    {        public WebBrowser()        {            InitializeComponent();            this.Loaded += new RoutedEventHandler(WebBrowser_Loaded);        }        void WebBrowser_Loaded(object sender, RoutedEventArgs e)        {            var dict = NavigationContext.QueryString; //页面导航参数字典            if (dict == null || dict.Count == 0)            {                return;            }            wpBrowser.Navigate(new Uri(dict["uri"], UriKind.RelativeOrAbsolute));            this.txtMsg.Text = "正在打开:" + dict["uri"] + "...";            wpBrowser.Navigated += new EventHandler
(wpBrowser_Navigated); //导航完成后事件 } void wpBrowser_Navigated(object sender, NavigationEventArgs e) { this.txtMsg.Text = "页面打开已完成"; } }}

对于页面导航的生命周期,可通过以下事件进行跟踪:Navigating、Navigated、NavigationProgress、NavigationFailed、NavigationStopped、LoadCompleted、FragmentNavigation 。具体情况大家可以参考MSDN的讲解。

这种通过WebBrowser控件导航到具体页面的方式实际开发中会经常用到。如果需要返回到上一页,硬件设备上提供了回退按钮,实际上它是基于NavigationService的GoBack方法实现的:

void btnGoBack(object sender, RoutedEventArgs e)        {            NavigationService.GoBack();        }

我们可以通过BackKeyPress事件编程禁用回退功能:

CancelGoBack         public WebBrowser()        {            InitializeComponent();            //注消页面的回退事件            this.BackKeyPress += new EventHandler
(WebBrowser_BackKeyPress); } void WebBrowser_BackKeyPress(object sender, CancelEventArgs e) { e.Cancel = true; }

最后再来总结下QueryString传参的几个特点:

a、使用“?”号区分传递参数与导航URI;

b、传递的参数之间使用“&”进行连接;

c、参数的值都只能是字符串。

QueryString传参的缺点是对于某些对象而不仅仅是字符串的传参比较难以处理。虽然我们可以通过序列化对象为字符串进行参数传递,但是序列化和反序列化消耗CPU资源,对性能要求较高的移动设备,这样的资源消耗必须是越少越好。

你可能感兴趣的文章
《工业控制网络安全技术与实践》一一1.5 本章小结
查看>>
报道称土耳其屏蔽网盘和GitHub以防止邮件泄露
查看>>
工信部张峰:统一的5G标准才能共享产业规模效应
查看>>
色情网站用户数据黑市开卖 不能说的“大人物”有哪些
查看>>
美最大IDC服务商Equinix宣布将继续使用可再生能源
查看>>
大规模实时数据处理openPDC
查看>>
美司法部要求Facebook配合国税局查税
查看>>
wxWidgets(2):一个好用C/C++ php 开源IDE —— CodeLite IDE
查看>>
Appium环境抢建(for web browser test)
查看>>
安防云计算核心技术探讨
查看>>
可从网站抓取数据的数据析取平台Import.io获1300万美元A轮融资
查看>>
混合云VPC组网场景和方案分享(一)
查看>>
Syniverse为亚洲100多家运营商提供一系列服务
查看>>
“光伏双反”与“201条款”有何差异?
查看>>
Android集成测试
查看>>
能源互联网将如何开拓光伏新市场?
查看>>
《Hadoop与大数据挖掘》一2.4.1 HDFS Java API操作
查看>>
《iOS App界面设计创意与实践》——iOS开发工具和资源
查看>>
Firefox OS 未死,这两款松下电视会搭载该系统
查看>>
AngularJS 1.3.0 正式发布,超光速发展!
查看>>