源碼下載: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;
}
}
}

【WIN10】使用自己的PageLoader加載Page的更多相关文章

  1. 容器加載Web工程的Web.xml文件介紹

    转 容器加載Web工程的Web.xml文件介紹 [-] 这篇文章主要是综合网上关于webxml的一些介绍希望对大家有所帮助也欢迎大家一起讨论 ---题记 一            Webxml详解 一 ...

  2. Jquery easy ui datagrid動態加載列問題

    1.如下图效果是当选择不同的日期范围时datagrid则会加载出对应的列数

  3. jquery 加載

    load(url,data,callback)從遠程服務器加載數據,并放入到被選中元素上: url是必須有的,希望加載的url: data是可選的,表示和請求一起發送的鍵值對數據: callback是 ...

  4. Windows Store App下代码加载page resource和resw文件里的string

    加载page resource 在page的code behind里: this.Resources["textBoxStyle"] 加载resw文件里的string: Resou ...

  5. [Win10] 安装虚拟光驱 用于加载ISO等镜像文件

    百度上找到UltraISO安装 一般来说安装到这就基本会显示一个 若经过上述步骤仍没出现虚拟光驱,则尝试进行加载ISO镜像文件到虚拟光驱然后再看看 这样基本就大功告成了~

  6. Magento2-2.3.4 win10安装完magento无法加载静态资源导致无法进入后台登录页面

    后台面无法进入,截图如下

  7. Ubuntu軟件商店加載失敗的解決方法

    Ubuntu軟件商店有的时候加载不出来,先用下面的试试 sudo apt install python-apt 如果不行,继续下面的方法 打开终端,运行下面的命令: sudo apt-get upda ...

  8. 【WIN10】我的第一個WIN10-UWP應用——古文觀止

    已上架,下載地址:https://www.microsoft.com/store/apps/9nblggh6cc32 特點是:繁體豎排,隱藏/顯示標點符號. 截幾張圖來瞅瞅. 1.主界面 這張圖使用的 ...

  9. 【WIN10】基本控件

    先發個下載地址: http://yunpan.cn/cHuCqYzvsWFAL  访问密码 3470 說明一下.這個示例只是最簡單的演示,並不能提供太大的實用價值. 後面會介紹 Bing & ...

随机推荐

  1. mysql关于“异步复制”“同步复制”“半同步复制”“无损复制”的概念与区别

    异步复制:主把事务写到binlog日志并不管从是否接收或者什么时候接收,commit之后,不会与从发生ack之类的交互. 同步复制:当主提交一个事务,在主向前端返回一个commit成功的指令前,必须保 ...

  2. Unix/Linux系统时间函数API

    首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...

  3. [转]google gflags 库完全使用

    简单介绍 gflags 是 google 开源的用于处理命令行参数的项目. 安装编译 项目主页:gflags ➜ ~ git clone https://github.com/gflags/gflag ...

  4. Cesium entity click

    var url = 'http://202.107.245.51:81/user/dev/api/v2/sql?rows_per_page=40&page=0&sort_order=a ...

  5. sleep命令

    sleep支持睡眠(分,小时) sleep 1 睡眠1秒 sleep 1s 睡眠1秒 sleep 1m 睡眠1分 sleep 1h 睡眠1小时

  6. Ubuntu下安装arm-linux-gnueabi-xxx编译器【转】

    转自:http://blog.csdn.net/real_myth/article/details/51481639 from: http://www.linuxdiyf.com/linux/1948 ...

  7. MVVM模式的模式简介

    MVVM模式简介 MVVM是Model.View.ViewModel的简写,这种模式的引入就是使用ViewModel来降低View和Model的耦合,说是降低View和Model的耦合.也可以说是是降 ...

  8. python 之sqlite3库学习

    # -*- coding:utf-8 -*- # 导入SQLite驱动:>>> import sqlite3# 连接到SQLite数据库# 数据库文件是test.db# 如果文件不存 ...

  9. mac搭建lamp环境

    转载:https://www.cnblogs.com/beautiful-code/p/7465320.html

  10. python网络编程--进程池

    一:进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程, 如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止. 进程池中有两个方法: apply a ...