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

windows phone 7 app.xaml启动过程

程序员文章站 2022-04-04 09:53:19
在网上找了一下基本没有人分析app.xaml的执行过程.只说是整个程序的生命周期而并没有深入.   但是其实在app.xaml.cs的注释里面也说的很清楚了.我根据自...
在网上找了一下基本没有人分析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的启动就算完成了.