设为首页 收藏本站
查看: 1056|回复: 0

Windows Phone 7 框架和页面

[复制链接]

尚未签到

发表于 2015-5-8 12:05:43 | 显示全部楼层 |阅读模式
  一、Windows Phone 7 框架(PhoneApplicationFrame)和页面(PhoneApplicationPage)
  在一个wp7应用程序运行的时候,程序的整个UI架构会由会有一个PhoneApplicationFrame和一个或者多个PhoneApplicationPage组成。PhoneApplicationFrame是一个顶级容器,里面容纳了PhoneApplicationPage,一个程序里面只有一个PhoneApplicationFrame,我们在App.xaml.cs里面看到的RootFrame就是当前程序的框架了。
  下面的方法会对RootFrame完成初始化操作



        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;
            RootFrame = new PhoneApplicationFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;
            phoneApplicationInitialized = true;
        }
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;
            RootFrame.Navigated -= CompleteInitializePhoneApplication;
        }
  
  关于(PhoneApplicationFrame)和(PhoneApplicationPage)的关系可以用下面的一张图来表示

DSC0000.jpg
  
  二、页面(PhoneApplicationPage)的导航
  wp7页面的互相跳转的逻辑是用一个堆栈结构的容器来管理这些页面。如下图


DSC0001.png   
  当应用程序中的页面调用 Navigate 时,当前页面会被放到后退堆栈上,并且系统将创建并显示目标页的新实例。当你在应用程序的页面之间进行导航时,系统会将多个条目添加到此堆栈。当页面调用 GoBack 时,或者当用户按手机的“返回”按键时,将放弃当前页面,并将堆栈顶部的页面从后退堆栈中弹出并进行显示。此后退导航会继续弹出并显示,直到堆栈中不再有条目。此时,点按手机的“返回”按键将终止应用程序。
  这个堆栈容器我们是可以通过PhoneApplicationPage出操控的,操控的相关方法和属性如下:
  属性
BackStack  获取一个 IEnumerable,它用于枚举后退导航历史记录中的条目。  
CanGoBack  获取一个值,该值指示在后退导航历史记录中是否至少存在一个条目。
  CanGoForward  获取一个值,该值指示在前进导航历史记录中是否至少存在一个条目。
  
  方法
  GoBack  导航到后退导航历史记录中的最新条目;如果后退导航时没有条目,则引发异常。
  GoForward  导航到前进导航历史记录中的最新条目,如果前进导航时没有条目,则引发异常。对于Windows Phone,该方法始终引发异常,因为没有前进导航堆栈。 (从 Frame 继承。)
RemoveBackEntry  此方法用于从后退堆栈中移除最近的条目,如果没有要移除的条目,则引发InvalidOperationException。如果您想移除多个项目,则多次调用此方法。此 API 是同步的,因此必须从UI 线程调用。
  
  事件
  Navigated  当已找到导航的内容并且内容可用时发生。 (从 Frame 继承。)
  Navigating  当请求新的导航时发生。 (从 Frame 继承。)
  NavigationFailed  在导航到请求的内容过程中遇到错误时发生。 (从 Frame 继承。)
  NavigationStopped  在通过调用 StopLoading()()()() 方法终止导航时发生,或者在当前导航进行过程中请求新的导航时发生。 (从 Frame 继承。)
  Obscured  当 shell chrome 包含帧时发生。  
  OrientationChanged  当 Orientation 属性发生更改时发生。
  
  三。下面用跟一个Demo来显示一下获取程序的 框架(PhoneApplicationFrame)和页面(PhoneApplicationPage)
  扩展方法类
  Extensions.cs



using System.Windows;
using System.Windows.Media;
using System.Collections.Generic;
using System.Linq;
namespace PageDemo
{
    public static class Extensions
    {
        ///
        /// 获取该元素的可见树里面所有的子元素
        ///
        /// 可见元素
        public static IEnumerable GetVisualDescendants(this DependencyObject element)
        {
            return GetVisualDescendantsAndSelfIterator(element).Skip(1);
        }
        ///
        /// 获取该元素的可见树里面所有的子元素以及该元素本身
        ///
        /// 可见元素
        public static IEnumerable GetVisualDescendantsAndSelfIterator(DependencyObject element)
        {
            Queue remaining = new Queue();
            remaining.Enqueue(element);
            while (remaining.Count > 0)
            {
                DependencyObject obj = remaining.Dequeue();
                yield return obj;
                foreach (DependencyObject child in obj.GetVisualChildren())
                {
                    remaining.Enqueue(child);
                }
            }
        }
        ///
        /// 获取该元素的可见树里面下一级的子元素
        ///
        /// 可见元素
        public static IEnumerable GetVisualChildren(this DependencyObject element)
        {
            return GetVisualChildrenAndSelfIterator(element).Skip(1);
        }
        ///
        /// 获取该元素的可见树里面下一级的子元素以及该元素本身
        ///
        /// 可见元素
        public static IEnumerable GetVisualChildrenAndSelfIterator(this DependencyObject element)
        {
            yield return element;
            int count = VisualTreeHelper.GetChildrenCount(element);
            for (int i = 0; i < count; i++)
            {
                yield return VisualTreeHelper.GetChild(element, i);
            }
        }
    }
}
  
测试获取程序页面类
  Test.cs



using System.Windows;
using Microsoft.Phone.Controls;
using System.Linq;
using System.Collections.Generic;
namespace PageDemo
{
    public class Test
    {
        ///
        /// 获取当前的程序展示的页面
        ///
        public static PhoneApplicationPage Page
        {
            get { return (Application.Current.RootVisual as PhoneApplicationFrame).GetVisualDescendants().OfType().FirstOrDefault(); }
        }
        ///
        /// 获取所有的框架下的页面
        ///
        public static List Pages
        {
            get { return (Application.Current.RootVisual as PhoneApplicationFrame).GetVisualDescendants().OfType().ToList(); }
        }
        ///
        /// 获取程序所有的UI元素
        ///
        public static List Elements
        {
            get { return (Application.Current.RootVisual as PhoneApplicationFrame).GetVisualDescendants().ToList(); }
        }
    }
}


  
            
        


        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (Test.Page != null)
            {
                MessageBox.Show(Test.Page.ToString());
            }
        }
  单击的效果
DSC0002.jpg
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-64970-1-1.html 上篇帖子: 《101 Windows Phone 7 Apps》读书笔记-TODO LIST 下篇帖子: Windows Phone 7完整的ROM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表