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

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

1. Windows Phone 8.1 的应用框架

一个应用拥有 1 个 Window,一个 Window 包含 1 个 Frame,一个 Frame 包含 多个 Page。

获取 Frame 的方法为:

Frame rootFrame = Window.Current.Content as Frame;

用 Page 填充 Frame 的方法为:

rootFrame.Navigate(typeof(MainPage))

 

2. Windows Phone 8.1 与 Windows Phone 8.0 导航的不同

(1)“返回键”的默认行为是返回到上一个应用(没有上一个应用则返回桌面),并不是上一个页面。

若想要实现返回上一个页面的操作,则需要改写 HardwareButtons.BackPressed 事件:

public App(){    this.InitializeComponent();    this.Suspending += this.OnSuspending;    HardwareButtons.BackPressed += HardwareButtons_BackPressed;}private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e){    Frame rootFrame = Window.Current.Content as Frame;    if( rootFrame != null && rootFrame.CanGoBack )    {        rootFrame.GoBack();        e.Handled = true;    }}

或者只对某个 Page 改写:

protected override void OnNavigatedTo(NavigationEventArgs e){    HardwareButtons.BackPressed += HardwareButtons_BackPressed;}private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e){    e.Handled = true;    if( Frame.CanGoBack )        Frame.GoBack();}protected override void OnNavigatedFrom(NavigationEventArgs e){    HardwareButtons.BackPressed -= HardwareButtons_BackPressed;}

(2)导航方法改为 Frame.Navigate。

导航时不再需要填写下一个页面的 Uri,而是直接使用页面的类型,并且可以直接将 Object 传递到下一个页面:

Frame.Navigate(typeof(Page2), "From MagePage.");

当然,这就需要下一个页面对传递过来的 Object 进行拆箱:

protected override void OnNavigatedTo(NavigationEventArgs e){    myTextBlock.Text = (string)e.Parameter;}

3. Frame.BackStack

应用可以获取之前的导航历史记录(不包括当前页面),Frame.BackStack 返回的是 IList<PageStackEntry>:

List
backStack = new List
();foreach( var item in Frame.BackStack ){ backStack.Add(item.SourcePageType.Name);}myListView.ItemsSource = backStack;

可以轻松移除导航历史中的某项:

var backStack = Frame.BackStack;backStack.RemoveAt(Frame.BackStackDepth - 1);if( Frame.CanGoBack )    Frame.GoBack();

4. NavigationCacheMode

应用默认不对页面进行缓存,若要缓存当前页面则可以设置页面 NavigationCacheMode 属性:

public MainPage(){    this.InitializeComponent();    this.NavigationCacheMode = NavigationCacheMode.Required;}

同样可以更改 App.xaml.cs 里 OnLaunched 方法的 CacheSize:

protected override void OnLaunched(LaunchActivatedEventArgs e){    Frame rootFrame = Window.Current.Content as Frame;    if( rootFrame == null )    {        rootFrame = new Frame();        // TODO: 将此值更改为适合您的应用程序的缓存大小        rootFrame.CacheSize = 1;if( e.PreviousExecutionState == ApplicationExecutionState.Terminated )        {        }        Window.Current.Content = rootFrame;    }    if( rootFrame.Content == null )    {        if( rootFrame.ContentTransitions != null )        {            this.transitions = new TransitionCollection();            foreach( var c in rootFrame.ContentTransitions )            {                this.transitions.Add(c);            }        }        rootFrame.ContentTransitions = null;        rootFrame.Navigated += this.RootFrame_FirstNavigated;        if( !rootFrame.Navigate(typeof(MainPage), e.Arguments) )        {            throw new Exception("Failed to create initial page");        }    }    Window.Current.Activate();}

5. NavigationHelper

如果你新建的项目不是空白项目,则会在项目中发现一个 Common 文件夹,而该文件夹中会有一个 NavigationHelper 类。

该类会帮你解决应用的导航问题,使用方法:

(1) 在某处创建一个 NavigationHelper 实例(如页面的构造函数中),并注册 LoadState 和 SaveState 事件的回调。

public MyPage(){    this.InitializeComponent();    var navigationHelper = new NavigationHelper(this);     this.navigationHelper.LoadState += navigationHelper_LoadState;    this.navigationHelper.SaveState += navigationHelper_SaveState;}private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e){ }private async void navigationHelper_SaveState(object sender, LoadStateEventArgs e){ }

(2) 在以下情况下注册页面以调入 NavigationHelper: 该页面通过重写 OnNavigatedTo 和 OnNavigatedFrom 事件以参与导航:

protected override void OnNavigatedTo(NavigationEventArgs e){    navigationHelper.OnNavigatedTo(e);}protected override void OnNavigatedFrom(NavigationEventArgs e){    navigationHelper.OnNavigatedFrom(e);}

 

转载于:https://www.cnblogs.com/xiaoshi3003/p/3741271.html

你可能感兴趣的文章
聊聊eureka instance的lastDirtyTimestamp
查看>>
Java 多线程 之 银行ATM实例
查看>>
对于文件管理的基本操作
查看>>
【自动化运维】从#手动到#远程到#批量安装虚拟机
查看>>
linux学习笔记——目录介绍、简单命令、通配符
查看>>
Linux--进程管理
查看>>
Hadoop之HDFS原理及文件上传下载源码分析(上)
查看>>
阿里云云服务器硬盘分区及挂载
查看>>
StratoIO WebPrinter如何引入外部JS?StratoIO WebPrinter控件常见的问题
查看>>
【JEECG技术文档】Redis与Eache切换文档
查看>>
网卡配置文件
查看>>
继承性
查看>>
static静态关键字
查看>>
jQuery事件
查看>>
zookeeper
查看>>
tar.gz tar.bz2解压
查看>>
19-思科防火墙:ASA静态NAT
查看>>
打造零售数据中台 数澜助百果园数字化转型
查看>>
YOLOv3目标检测实战:交通标志识别
查看>>
用 Python 进行微信公众号开发
查看>>