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