欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

windows phone 7 app.xaml启动过程,phoneapp.xaml

来源: 开发者 投稿于  被查看 10458 次 评论:123

windows phone 7 app.xaml启动过程,phoneapp.xaml


在网上找了一下基本没有人分析app.xaml的执行过程.只说是整个程序的生命周期而并没有深入.

 

但是其实在app.xaml.cs的注释里面也说的很清楚了.我根据自己的理解翻译一下.

 

首先有四个事件要注意,在app.xaml文件中的Application.ApplicationLifetimeObjects节点定义

 

 

<Application.ApplicationLifetimeObjects>

    <!--Required object that handles lifetime events for the application-->

    <shell:PhoneApplicationService

        Launching="Application_Launching" Closing="Application_Closing"

        Activated="Application_Activated" Deactivated="Application_Deactivated"/>

</Application.ApplicationLifetimeObjects>

————————————————————————————–

这里多说一句,为什么在xaml文件定义的事件可以被程序知道.因为每个xaml.cs的构造函数都会调用一个InitializeComponent()函数.

这个函数是编译器自动生成的.内容如下

 

[System.Diagnostics.DebuggerNonUserCodeAttribute()]

        public void InitializeComponent() {

            if (_contentLoaded) {

                return;

            }

            _contentLoaded = true;

            System.Windows.Application.LoadComponent(this, new System.Uri("/PhoneSample;component/App.xaml", System.UriKind.Relative));

        }

可以看到在这个函数里加载了xaml文件.如果你查看其他界面Page的InitializeComponent()函数.你可能会更明白xaml文件的作用

下面是来自Phone.Toolkit的MainPage的例子

 

 

internal System.Windows.Controls.Grid LayoutRoot;

internal System.Windows.Controls.StackPanel TitlePanel;

internal System.Windows.Controls.TextBlock ApplicationTitle;

internal System.Windows.Controls.TextBlock PageTitle;

internal System.Windows.Controls.Grid ContentPanel;

private bool _contentLoaded;

 

[System.Diagnostics.DebuggerNonUserCodeAttribute()]

public void InitializeComponent() {

    if (_contentLoaded) {

        return;

    }

    _contentLoaded = true;

    System.Windows.Application.LoadComponent(this, new System.Uri("/PhoneToolkitSample;component/MainPage.xaml", System.UriKind.Relative));

    this.LayoutRoot = ((System.Windows.Controls.Grid)(this.FindName("LayoutRoot")));

    this.TitlePanel = ((System.Windows.Controls.StackPanel)(this.FindName("TitlePanel")));

    this.ApplicationTitle = ((System.Windows.Controls.TextBlock)(this.FindName("ApplicationTitle")));

    this.PageTitle = ((System.Windows.Controls.TextBlock)(this.FindName("PageTitle")));

    this.ContentPanel = ((System.Windows.Controls.Grid)(this.FindName("ContentPanel")));

}

————————————————————

在这里注册了程序生命周期的四个事件,Launching,Closing,Activated,Deactivated

启动程序的时候会调用Application_Launching,退出程序的时候调用Application_Closing

启动别的程序时调用Application_Deactivated,返回到本程序时调用Application_Activated

 

1.App构造函数

 

 

public App()

{

    // Global handler for uncaught exceptions.

    //注册一个全局的异常处理handle,专门处理程序中没有处理的异常.

    UnhandledException += Application_UnhandledException;

    // Show graphics profiling information while debugging.

   //下面这个是很有用的一个"宏",如果是出于调试状态则,IsAttached==true

    if (System.Diagnostics.Debugger.IsAttached)

    {

        // Display the current frame rate counters.

        //显示当前屏幕显示的帧率,如果不想显示可以去掉

        Application.Current.Host.Settings.EnableFrameRateCounter = true;

        // Show the areas of the app that are being redrawn in each frame.

        //显示程序每一帧需要重绘的区域.

        //Application.Current.Host.Settings.EnableRedrawRegions = true;

        // Enable non-production analysis visualization mode,

        // which shows areas of a page that are being GPU accelerated with a colored overlay.

        //不懂

        //Application.Current.Host.Settings.EnableCacheVisualization = true;

        //在Application.Current.Host.Settings中还有其他参数.具体请参考Settings类.

    }

    // Standard Silverlight initialization

    //标准Silverlight初始化,上面已经说过了.

    InitializeComponent();

    // Phone-specific initialization

    //手机专有的初始化.后面介绍

    InitializePhoneApplication();

}

2.InitializePhoneApplication函数的作用

 

    // Avoid double-initialization

//防止2次初始化.

    private bool phoneApplicationInitialized = false;

 

    // Do not add any additional code to this method

    private void InitializePhoneApplication()

    {

        if (phoneApplicationInitialized)

            return;

 

        // Create the frame but don't set it as RootVisual yet; this allows the splash

        // screen to remain active until the application is ready to render.

    //初始化程序框架,暂时不给RootVisual复制.这样可以让splash显示,知道在程序render完成

        RootFrame = new TransitionFrame();

    //加载完成事件,在这个事件中给RootVisual=RootFrame开始显示程序界面.

        RootFrame.Navigated += CompleteInitializePhoneApplication;

 

        // Handle navigation failures

    //处理程序navigationg失败

        RootFrame.NavigationFailed += RootFrame_NavigationFailed;

 

        // Ensure we don't initialize again

    //初始化完成.不再初始化

        phoneApplicationInitialized = true;

    }

在RootFrame加载完成后,把RootFrame赋值到程序的RootVisual,这样MainPage.xaml就得到显示了.

 

为什么显示的是MainPage?

 

这是在WMAppMainfest.xml中的节点定义的.你可以换成任意你喜欢的page.

 

到这里app的启动就算完成了.

相关频道:

用户评论