已经有一段时间没有写博客来记录自己的学习点滴了。现在回想起来确实有些惭愧,期间经历了一些事情,到目前为止算是平息了,是时候该收收心来充实自己了。 在本篇缪文中,楼主打算给UWP开发的初学者讲述一个在开发中经常遇到的很现实的问题:页面回退逻辑 。 ...
已经有一段时间没有写博客来记录自己的学习点滴了。现在回想起来确实有些惭愧,期间经历了一些事情,到目前为止算是平息了,是时候该收收心来充实自己了。
在本篇缪文中,楼主打算给UWP开发的初学者讲述一个在开发中经常遇到的很现实的问题:页面回退逻辑 。
众所周知,UWP的应用程序理论上是可以运行在Windows上的各种设备上,其中包括Windows PC、WindowsMobile、XBox、IOT等。当我们的UWP应用程序运行在不同的设备上时,不同设备间的页面回退逻辑我们就要考虑周全,要考虑不同设备间的页面回退操作该如何设计才能更好的满足用户的使用需求。因此,我们有必要将不同设备间的页面回退逻辑进行统一封装,这样一来不仅有利于代码的维护,而且也有利于回退功能的扩充,实现了实现了“高内聚低耦合“。为了方便,楼主这里只简单论述一下当我们的UWP应用程序运行在PC上和Mobile上时该如何处理不同平台的页面回退逻辑。当应用程序运行在PC上时,页面回退常常是通过用户点击应用程序提供的一个回退按钮来进行页面回退,但是当我们的应用程序运行在Mobile上时,用户更愿意使用手机设备上提供的物理后退键来进行页面回退,这样一来,我们就需要使用封装的思想来进行封装。
1、理论分析:
在新的MSDN中,微软为我们提供了一套新的API:SystemNavigationManager 。当UWP应用程序在PC上运行的时候,通过此API,我们可以为应用程序提供一个回退按钮来向用户暗示此页面是可以回退的,当用户点击该按钮后,页面成功回退。但是当我们的UWP应用程序运行在Mobile上时,如果还是用这种方法来进行页面回退的的话,对用户来说就可能不是很友好,因此,我们要投其说好,用手机设备上的物理后退键来实现相应的页面回退逻辑,其对应的API为:HardwareButtons.BackPressed。分析到这,我们基本上明白该如何处理这两中设备间的回退逻辑的差异。So,问题来了:我们该把这套逻辑放到哪里合适?何时使用这套逻辑较为合适? 这是两道主观题,仁者见仁智者见智。楼主这里抛砖引玉,为初学者论述一种方法。
由于应用程序刚启动的时候会触发App.OnLaunched()函数,所以我们需要修改OnLaunched()函数;其次,为了保证页面的唯一性,我们这里使用“框架页”的方法来承载不同的页面,通过Frame来完成页面的跳转;最后,我们还需要实现一个用户控件来方式应用程序的主题框架。
总结一句话就是:让应用程序来加载我们的用户控件,让用户控件来承载我们的框架页,让框架页来完成应用程序的页面跳转。
是不是感觉很绕口??没关系,接下来我们看看实际的代码改如何写………………
2、代码实现:
首先:
我们需要为我们的应用程序创建一个页面跳转服务类:NavigationService,该类封装来不同平台间的页面回退逻辑。需要指出的是:由于该类使用来不同回退逻辑,因此我们使用哪个平台的回退逻辑就添加对哪个平台的扩展引用,我这里只添加来对Mobile的扩展引用。代码很简单,我相信你看一下就会的。
1 public class NavigationService 2 { 3 public static NavigationService Instance { get; protected set; } 4 5 private Frame frame; 6 7 public Stack<Type> PageStack { get; protected set; } 8 9 public NavigationService(ref Frame frame)10 {11 if (Instance != null)12 {13 throw new Exception("Only one navigation service can exist in a App.");14 }15 Instance = this;16 this.frame = frame;17 this.PageStack = new Stack<Type>();18 19 SystemNavigationManager.GetForCurrentView().BackRequested += NavigationService_BackRequested;20 if (ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))21 {22 HardwareButtons.BackPressed += HardwareButtons_BackPressed;23 }24 }25 26 public void NavigateTo(Type pageType, object parameter)27 {28 if (PageStack.Count > 0)29 {30 //返回位于Stack顶部的对象但不将其移除。31 if (PageStack.Peek() == pageType)32 {33 return;34 }35 }36 PageStack.Push(pageType);37 frame.Navigate(pageType, parameter);38 UpdateBackButtonVisibility();39 }40 41 public void NavigateToHome()42 {43 while (frame.CanGoBack)44 {45 frame.GoBack();46 UpdatePageStack();47 }48 UpdateBackButtonVisibility();49 }50 private void UpdatePageStack()51 {52 if (PageStack.Count > 0)53 {54 PageStack.Pop();55 }56 }57 58 private void UpdateBackButtonVisibility()59 {60 SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = frame.CanGoBack ?61 AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;62 }63 64 private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)65 {66 if (frame.CanGoBack)67 {68 frame.GoBack();69 UpdatePageStack();70 e.Handled = true;71 }72 }73 74 private void NavigationService_BackRequested(object sender, BackRequestedEventArgs e)75 {76 if (frame.CanGoBack)77 {78 frame.GoBack();79 UpdatePageStack();80 }81 UpdateBackButtonVisibility();82 }83 }
原标题:如何在UWP中统一处理不同设备间的页面回退逻辑
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。