欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Windows Phone 7 框架和页面

程序员文章站 2022-04-30 19:53:25
一、windows phone 7 框架(phoneapplicationframe)和页面(phoneapplicationpage) 在一个wp7应用程序运行的时候,程序的整个ui架构会由会有一...

一、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)的关系可以用下面的一张图来表示

  Windows Phone 7 框架和页面


 

二、页面(phoneapplicationpage)的导航

wp7页面的互相跳转的逻辑是用一个堆栈结构的容器来管理这些页面。如下图

  Windows Phone 7 框架和页面


 

当应用程序中的页面调用 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
    {
        /// <summary>
        /// 获取该元素的可见树里面所有的子元素
        /// </summary>
        /// <param name="element">可见元素</param>
        public static ienumerable<dependencyobject> getvisualdescendants(this dependencyobject element)
        {
            return getvisualdescendantsandselfiterator(element).skip(1);
        }
        /// <summary>
        /// 获取该元素的可见树里面所有的子元素以及该元素本身
        /// </summary>
        /// <param name="element">可见元素</param>
        public static ienumerable<dependencyobject> getvisualdescendantsandselfiterator(dependencyobject element)
        {
            queue<dependencyobject> remaining = new queue<dependencyobject>();
            remaining.enqueue(element);

            while (remaining.count > 0)
            {
                dependencyobject obj = remaining.dequeue();
                yield return obj;

                foreach (dependencyobject child in obj.getvisualchildren())
                {
                    remaining.enqueue(child);
                }
            }
        }
        /// <summary>
        /// 获取该元素的可见树里面下一级的子元素
        /// </summary>
        /// <param name="element">可见元素</param>
        public static ienumerable<dependencyobject> getvisualchildren(this dependencyobject element)
        {
            return getvisualchildrenandselfiterator(element).skip(1);
        }
        /// <summary>
        /// 获取该元素的可见树里面下一级的子元素以及该元素本身
        /// </summary>
        /// <param name="element">可见元素</param>
        public static ienumerable<dependencyobject> 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
    {
        /// <summary>
        /// 获取当前的程序展示的页面
        /// </summary>
        public static phoneapplicationpage page
        {
            get { return (application.current.rootvisual as phoneapplicationframe).getvisualdescendants().oftype<phoneapplicationpage>().firstordefault(); }
        }
        /// <summary>
        /// 获取所有的框架下的页面
        /// </summary>
        public static list<phoneapplicationpage> pages
        {
            get { return (application.current.rootvisual as phoneapplicationframe).getvisualdescendants().oftype<phoneapplicationpage>().tolist<phoneapplicationpage>(); }
        }
        /// <summary>
        /// 获取程序所有的ui元素
        /// </summary>
        public static list<dependencyobject> elements
        {
            get { return (application.current.rootvisual as phoneapplicationframe).getvisualdescendants().tolist<dependencyobject>(); }
        }
    }
}

  <grid x:name="contentpanel" grid.row="1" margin="12,0,12,0">
            <button content="button" height="72" horizontalalignment="left" margin="139,176,0,0" name="button1" verticalalignment="top" width="160" click="button1_click" />
        </grid>

        private void button1_click(object sender, routedeventargs e)
        {
            if (test.page != null)
            {
                messagebox.show(test.page.tostring());
            }
        }

单击的效果

  Windows Phone 7 框架和页面


摘自  linzheng