windowsphone开发页面导航.docx
《windowsphone开发页面导航.docx》由会员分享,可在线阅读,更多相关《windowsphone开发页面导航.docx(16页珍藏版)》请在冰豆网上搜索。
![windowsphone开发页面导航.docx](https://file1.bdocx.com/fileroot1/2023-8/13/87f7ad3f-4c3e-47c2-a1b8-58e895c7de96/87f7ad3f-4c3e-47c2-a1b8-58e895c7de961.gif)
windowsphone开发页面导航
在应用的开发过程中,我们可能需要使用不止一个页面来完成不同的功能,此时就需要在不同页面间导航,如同在中一样,在WindowsPhone中,就会使用到NavigationService和NavigationContext等相关类来完成这些工作。
本文就来介绍关于Navigation的基本使用方式。
从当前页面导航到其他页面:
viewsource
print?
1
NavigationService.Navigate(newUri("/Detail.xaml",UriKind.Relative));
如果需要传递参数到待目标页面,可以使用类似于weburl中的参数方式:
viewsource
print?
1
stringurl=string.Format("/Detail.xaml?
Click={0}",hbEditDetail.Name);
2
this.NavigationService.Navigate(newUri(url,UriKind.Relative));
在目标页面,我们可以使用NavigationContext中的Dictionary属性来获取传递的参数值:
viewsource
print?
1
if(NavigationContext.QueryString.ContainsKey("Click")){
2
tbQueryString.Text=string.Format("Youclickedthecontrol{0}",NavigationContext.QueryString["Click"]);
3
}
在实际使用中,可能有很多页面,并且我们希望能在这些页面间共享数据,那么我们可以通过在App类中定义需要的公共属性等,那么在需要获取共享的数据时,只需通过Application.Current来处理。
这样就避免了我们需要在每个页面上定义需要的QueryString,对于一些重复的共享数据,这样会有一定的好处。
另外,在导航页面时使用的NavigationService.Navigate时,需要指定待导航页面的名称及路径,我们也可以通过定义一些全局变量来管理这些数据,可以使用扩展方法的方式来对PhoneApplicationPage类提供额外的功能,具体参考如下(参考MS的官方样例):
viewsource
print?
01
publicenumApplicationPages
02
{
03
DataList,
04
DataView,
05
DataEdit,
06
Report
07
}
08
09
publicstaticclassNavigation
10
{
11
///
12
///gotopage.
13
///
14
///Theapplicationpage.
15
publicstaticvoidGoToPage(thisPhoneApplicationPagephoneApplicationPage,ApplicationPagesapplicationPage)
16
{
17
switch(applicationPage)
18
{
19
caseApplicationPages.DataList:
20
phoneApplicationPage.NavigationService.Navigate(newUri("/Views/DataList.xaml",UriKind.Relative));
21
break;
22
23
caseApplicationPages.DataView:
24
phoneApplicationPage.NavigationService.Navigate(newUri("/Views/DataView.xaml",UriKind.Relative));
25
break;
26
27
caseApplicationPages.DataEdit:
28
phoneApplicationPage.NavigationService.Navigate(newUri("/Views/DataEdit.xaml",UriKind.Relative));
29
break;
30
31
caseApplicationPages.Report:
32
phoneApplicationPage.NavigationService.Navigate(newUri("/Views/Report.xaml",UriKind.Relative));
33
break;
34
}
35
}
36
}
在页面中调用该方法:
viewsource
print?
1
this.GoToPage(ApplicationPages.DataEdit);
2>
跟林永坚老师学WP7开发
∙内容概览
∙使用xaml进行导航
∙使用C#代码进行导航
∙地址别名
∙页面之间的数据传递
∙回退按钮
为了更好的控制导航,我们需要先知道页面的架构与框架:
∙Frame
∙只有一个单独的PhoneApplicationFrame
∙包含一个或多个PhoneApplicationPage
∙也包含系统托盘和应用程序栏
∙Page
∙包含标题,可以有独立的应用程序栏
∙Page之间可以相互导航
∙SIlverlightforwindowphone使用以页面为基础的页面导航
∙与web的页面导航类似
∙每个独立的都有唯一的URI
∙每个独立的页面都是没有状态的
概念介绍完了,下面就是例子了:
∙XAML中使用导航
在导航里的一个很重要的控件:
hyplinkbutton,所以我先拖四个hyplinkbutton到界面中来,
这样就是主页面了,接下来再创建一个新的导航到的页面Music.xaml到views目录下,然后添加contant为音乐的hyperlinkbutton的NavigateUri
这样启动程序就可以正常的导航了,下面的三个按照同样的操作就可以了,
∙用C#代码进行导航(使用到一个很重要的类)
∙使用别名进行导航需要3步:
第一步需要在App.xaml文件里定义映射规则,第二部在App.xaml.cs里初始化这个定义的Resource
第二部在App.xaml.cs里初始化这个定义的Resource
第三步:
在页面里使用,把HyperLinkButton的NavigationURi属性修改成如下,到此别名导航就完成了。
Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
∙页面间传递数据,最常用的是通过QueryString来传递数据,
song=歌曲1"Height="30" HorizontalAlignment="Left" Margin="175,230,0,0" Name="hyperlinkButton2"VerticalAlignment="Top" Width="200" />
∙在Music.xaml页面被加载的时候我们就显示传递过来的参数,
using System;
using System.Collections.Generic;
∙
using System.Linq;
using System.Net;
∙
using System.Windows;
using System.Windows.Controls;
∙
using System.Windows.Documents;
using System.Windows.Input;
∙
using System.Windows.Media;
using System.Windows.Media.Animation;
∙
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
∙
namespace PageNavigation.views
∙
{
public partial class Music:
PhoneApplicationPage
∙
{
public Music()
∙
{
InitializeComponent();
∙
}
∙
private void PhoneApplicationPage_Loaded(object sender,RoutedEventArgse)
{
∙
if (NavigationContext.QueryString.Count>0)
{
∙
textBlock1.Text=NavigationContext.QueryString["song"];
}
∙
}
∙
}
}
∙使用别名来传递参数,首先需要修改App.xaml里的映射规则
页面修改为
注意:
NavigationService默认不能传递对象(可以通过使用App类的静态属性、SIngleton类、把对象分解为QueryString来传递......)
3小技巧
前文用几个例子对导航做了简单介绍,在一般应用中,使用上一篇文章中说到的方法,其实也够用了,不过,为了能够处理一些特殊的情况,有几个小技巧还是有必要了解一下的。
一、到底该不该设置“后退”操作?
因为手机的硬件层就有一个“回退”按钮,按理说我们不需要在程序中再添加什么回退按钮之类的,不过,还是有必要看看如何手动加入回退功能。
1、新建一个WP应用项目。
2、除默认的主页外,新建一个页面Page2.xaml。
3、在主页上放一个按钮,编写Click事件处理代码,导航到Page2。
源码打印?
1.private void button1_Click(object sender, RoutedEventArgs e)
2.{
3. this.NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative));
4.}
4、在Page2也放一个按钮,并编写单击事件处理代码。
4、在Page2也放一个按钮,并编写单击事件处理代码。
4、在Page2也放一个按钮,并编写单击事件处理代码。
源码打印?
1.private void button1_Click(object sender, RoutedEventArgs e)
2.{
3. this.NavigationService.GoBack();
4.}
5、现在,你可以欣赏你的程序了。
二、如何屏蔽掉“回退”按钮?
这种情况下不多见,屏蔽掉回退按钮意味着无法通过按下“回退”进行向后导航,这个做法要慎用。
要完成该操作,就得处理BackKeyPress事件,把事件参数e的Cancel属性设置为true即可取消“回退”键的操作。
源码打印?
1.this.BackKeyPress += (sender, e) =>
2. {
3. e.Cancel = true;
4. };
三、如何删除导航历史记录?
比如说,我现在从主页导航到页面B,再从页面B导航到页面C,但我不希望用户导航回页面B,而是直接导航回主页。
准备三个页面做测试,从主页导航到B,从B导航到C,应该没问题了,不用我再重复。
然后,因为现在我们要在导航的回退历史记录中删除页面B,所以,我们在离开页面B后把历史记录删除。
也就是说,在页面B中重写OnNavigatedFrom方法。
源码打印?
1.protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
2.{
3. base.OnNavigatedFrom(e);
4. PhoneApplicationFrame myFrame = Application.Current.RootVisual as PhoneApplicationFrame;
5. if (myFrame !
= null)
6. {
7. try
8. {
9. myFrame.RemoveBackEntry();
10. }
11. catch (InvalidOperationException ex)
12. {
13. MessageBox.Show(ex.Message);
14. }
15. }
16.
17.}
从例子中看到,使用PhoneApplicationFrame类的RemoveBackEntry方法删除最新一条记录,每次只删除一条,要删除多条,就调用N次。
因为导航历史记录是栈结构的,后进先出,所以,就像你拿一堆书放在桌面上一样,首先拿掉的是放在最上面的,如下图所示:
从例子中看到,使用PhoneApplicationFrame类的RemoveBackEntry方法删除最新一条记录,每次只删除一条,要删除多条,就调用N次。
因为导航历史记录是栈结构的,后进先出,所以,就像你拿一堆书放在桌面上一样,首先拿掉的是放在最上面的,如下图所示: