源碼下載:http://yunpan.cn/cFwwrT4V5rHIM  访问密码 1b97

在上一篇博客中,我已經說明了為什麼要自己寫一個PageLoader。原因就是,Frame的GoBack只是簡單的重新加載一個頁面,並不會保存原來的頁面的狀態。

怎麼樣才能保存原來的頁面狀態呢?只要原來的Frame不刪除,不就可以保存原來的狀態了嗎?所以實現起來就簡單多了,每Navigate一個頁面,我們就生成一個Frame,添加到Grid中,當Back時,我們就把這個Frame刪除掉。這樣就可以達到我們的目的了。

為了保證我們新加的Frame一定顯示在最前面,所以我們可以強制把ZIndex++,即每添加一個Frame,它的ZIndex都遞增。

而且因為是用了Add、Delete,我們就可以系統主題動畫了。

 public void Init (Grid root)
{
root_ = root; if (root_.ChildrenTransitions == null)
{
TransitionCollection trans = new TransitionCollection()
{
new AddDeleteThemeTransition() { }
};
root_.ChildrenTransitions = trans;
}
else
{
root_.ChildrenTransitions.Add(new AddDeleteThemeTransition());
}
}

PageLoader的源碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Animation; namespace NavigateProj
{
public class PageLoader
{
private class PageInfo
{
public Type PageType { get; set; }
public Frame PageFrame { get; set; } public object PageParam{ get; set; } public bool Load()
{
return PageFrame.Navigate(PageType, PageParam);
}
} private static PageLoader self_ = null;
private Grid root_ = null;
private Stack<PageInfo> pages_ = new Stack<PageInfo>();
private int zindex_ = ; private PageLoader() { } public static PageLoader Instance
{
get
{
if (self_ == null)
{
self_ = new PageLoader();
}
return self_;
}
} public void Init (Grid root)
{
root_ = root; if (root_.ChildrenTransitions == null)
{
TransitionCollection trans = new TransitionCollection()
{
new AddDeleteThemeTransition() { }
};
root_.ChildrenTransitions = trans;
}
else
{
root_.ChildrenTransitions.Add(new AddDeleteThemeTransition());
}
} public bool LoadPage (Type pageType, object param = null)
{
if (root_ == null) return false; PageInfo newPageInfo = new PageInfo()
{
PageType = pageType,
PageFrame = new Frame(),
PageParam = param,
}; // ZIndex 保證在最前面
Canvas.SetZIndex(newPageInfo.PageFrame, zindex_); if (!newPageInfo.Load())
{
return false;
} root_.Children.Add(newPageInfo.PageFrame);
++zindex_;
pages_.Push(newPageInfo);
return true;
} public bool Back ()
{
if (pages_.Count <= ) return false; var page = pages_.Pop();
root_.Children.Remove(page.PageFrame);
--zindex_; var currPage = pages_.Peek();
return true;
}
}
}

最新文章

  1. Mysql hql字符串字段中是否包含某个字符串,用 find_in_set
  2. 小白菜初探nodejs
  3. 3.27考试总结(hnoi难度)
  4. 百度编辑器ueditor获取不到内容?请把form放在table等其他元素最外面
  5. 来一场说走就走的骑行---23KM的上班探路行动圆满结束
  6. Lamp下安装memcached
  7. Codeforces 479E Riding in a Lift
  8. php 原生或curl获取 http headers
  9. AngularJs学习笔记1——总体介绍
  10. ASP.NET没有魔法——ASP.NET MVC 模型绑定
  11. 安卓TV开发(十) 智能电视开发之在线视频直播
  12. 通过VuePress管理项目文档(一)
  13. 第57章 GrantValidationResult - Identity Server 4 中文文档(v1.0.0)
  14. 20175205 2018-2019-2 《Java程序设计》第五周学习总结
  15. Zephyr学习(五)线程和调度
  16. Ubuntu输入命令无效的问题
  17. [CF1019D]Large Triangle[极角排序+二分]
  18. bzoj 1432 数学(找规律)
  19. 独立成分分析(Independent component analysis, ICA)
  20. 【angularJS】Route路由

热门文章

  1. Dream------scala--类的属性和对象私有字段实战详解
  2. 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7
  3. iframe 同域下父子页面的通信
  4. docker强制关闭命令
  5. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
  6. Python的简单语法(一)
  7. 在oracle中varchar和varchar2有什么区别?
  8. spring-boot分环境打包为tar包
  9. CCF CSP 201403-2 窗口
  10. Oracle学习笔记——点滴汇总