有很多途径可以提升Windows Phone 7应用程序载入和启动时的性能。本节将讨论这些话题。
应用程序通常需要预加载一些资源以保证应用程序可以启动后这些资源立即可用,即使这会导致在加载完成前应用程序暂不显示。启动画面就是在其他内容还在加载时呈现的一个内容区域。
所有的Windows Phone 项目模板都包含一个启动画面图片。其默认文件名为SplashScreenImage.jpg ,当程序正在启动时会自动显示。如果你的程序需要花费1秒以上的时间才能呈现第一个页面,那么建议你为程序设置一个启动画面。
你可以使用Windows Phone 项目模板提供的默认启动画面,也可以创建自己的启动画面以展示商标或产品信息,如应用Logo、免责声明等。如果你想在启动画面上展示一些重要信息,并且延长其显示时间,可以重写页面的OnNavigatedTo()方法并调用M:System.Threading.Thread.Sleep(System.Int32)方法,指定你想要启动画面显示的时间。
要创建一个自定义启动画面,先创建一个480*800的JPG图片,命名为SplashScreenImage.jpg,并替换应用程序项目中默认的同名图片(注意要设置其BuildAction为Content)。这样,当程序启动时,将会显示自定义图片。
另一个选择是用应用程序首页面的截屏作为启动画面,以制造一种程序启动很快的感觉。如果想使用应用程序的首页面截屏作为启动画面,请尝试以下操作以捕获一个截屏图片:
另一个提高应用程序启动性能的方法是最小化应用程序集的大小。当向Windows Phone应用商店提交应用时,应用中的程序集会被生成签名,以后程序每次启动时都会检查这个签名。检查程序集签名所用的时间会随着应用程序大小的增加而增加。因为签名检查的结果会被缓存,所以签名检查不会影响之后的程序加载速度,程序的第一次加载速度会受到影响。以下一些技巧可以减小程序集的大小。
注意:如果要创建一个可复用的控件或组件,应当通过设置其中的资源文件为Resource,将其包含在程序集中。此时,应当尽量少用图片之类的资源。
可以考虑将程序分解为多个按需加载的小程序集以进一步缩短启动时间。要实现这个目的,可以在解决方案中新建一个Windows Phone类库项目专门承载按需加载的页面。之后在主程序项目中引用该类库项目。通过HyperLink控件或Navigate方法可以导航到这些页面。以下代码示范了如何导航到PageInExternalAssembly程序集中的ExternalPage.xaml页面。
C#代码 private void button1_Click(object sender, RoutedEventArgs e) { // Use the name of the separate assembly when generating the Uri for the page NavigationService.Navigate(new Uri("/PageInExternalAssembly;component/ExternalPage.xaml", UriKind.Relative)); }
所有构造函数和Loaded事件中的代码都会在应用程序显示第一帧之前运行。页面和控件的构造函数解析XAML、实例化XAML中定义的对象是很耗时间的。因此应当限制在这些方法中再执行其他的耗时的操作。如果需要执行载入文件或其他的复杂处理,应当将其延迟到稍后的事件中,或在一个后台线程中延迟执行。一种方案是在LayoutUpdated的事件处理程序中执行这些耗时的操作。LayoutUpdated事件会在应用程序的第一帧显示之后才执行。以下示例演示了如何操作。
C#代码 private bool _onNavigatedToCalled = false; public Page() { InitializeComponent(); LayoutUpdated += new EventHandler(Page_LayoutUpdated); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { _onNavigatedToCalled = true; } private void Page_LayoutUpdated(object sender, EventArgs e) { if (_onNavigatedToCalled == true) { _onNavigatedToCalled = false; Dispatcher.BeginInvoke(() => { // Do your stuff here, in the “future” } } ); } }