Silverlight中的Application类
本文对应于Silverlight 2帮助文档中"Application Model"章节,微软的介绍顺序或许着眼于宏观架构,而本文则属于问题导向型的介绍。在实际中遇到初始化化页面、加载其他xap中的应用程序、调用资源文件等问题,在解决过程,不断的参考阅读了这部分内容。尽管单一逐个地解决了问题,但重新组织,并整理下自己的思路,理解将会更加深刻。
Application类封装了一个Silverlight应用程序(单例模式),它主要表示应用程序代码在 Silverlight 插件生命周期中的入口点(插件激活过程可参考下图)。提供若干服务:应用程序生存期管理、 应用程序资源文件加载、 未处理的异常处理和Web 宿主集成等。("Application Service")
Application类有三个事件成员:Startup、Exit和UnhandledException。在新创建Silverlight应用程序时,在自动生成的App.xaml.cs会看到相应事件的处理方法。Exit和UnhandledExeption可查看帮助文档,暂时只关注Startup事件。
Startup用来在应用程序启动时进行一些初始化操作,最基本的指定RootVisual属性来显示主页面。其次就是检索传进来的参数StartupEventArgs 对象的 InitParams 属性,进行相应的处理,比如如何确定不同的起始主页面,参考TerryLee的《在Silverlight 2应用程序中切换用户控件》。还可以通过HtmlDocument.QueryString从宿主网页中检索URL参数,通过IsolatedStorageSettings类检索先前应用程序的会话数据等。
此外,Startup中也可以检索其他资源,比如用WebClinet等异步下载其他资源文件或程序集。若文件为Zip或xap,则要利用到Application.GetResourceStream方法。若文件为程序集,则要创建一个新的AssemblyPart对象,并调用它的Load方法来进行加载。当然,调用其他资源文件,也可不必Startup中进行。比如可以在某页面中点击按钮来触发事件,调用其他xap中的某个程序集。
理解调用外部xap中程序集的过程,首先需要了解"Application Structure",查看并理解AppManifest.xaml文件。需要注意的是,beta2中用Deployment对象来获取AppManifest.xaml文件中的元素已不再有效,可以利用Linq方式读取。可参考《Dynamic Load & Invoke Other Xap For SilverLight 2.0》,内容是中文的,这篇文章有改进之处,比如把这个过程抽象为一个方法,可供以后直接调用。
Application类处理上面提到的Application.GetResourceStream方法外,还有一个常见的方法就是Application.LoadComponent。查看page等页面构造函数中InitializeComponent()方法即可看到它的出现。该方法也常用来调用"Build Action"为"Page"的xaml文件,参考《动态加载XAML文件》。
Application还有其他方法,不再逐一介绍。最后看一下Application的属性,Current、Host、Resource和RootVisual。
Application.Current用来提供对当前应用程序的 Application 实例的共享访问。由于一般系统自动生成的是从Appliction继承的App类,因此常见形式为:App currentApp = (App)Application.Current;
Host,获取有关 Silverlight 应用程序的主机的各种详细信息。比如txtBlock.Text = App.Current.Host.Background;
Application.Resource常出现在App.xaml文件中,指应用于整个应用程序的资源。相对的就是单一页面域的资源和inline式资源。
RootVisual就来获取或指定应用程序的起始页面。