启动器和选择器学习-----(1)总括
在Windows Phone中当应用程序需要获取手机中的信息时,比如联系人的手机号码或者拍摄照片,都要启动相应的“任务”。而在Windows Phone对这些任务进行了分类,一种叫做启动器(launcher),另一种叫做选择器(chooser)。
启动器(launcher)
正如它们的名字,启动器就是用于启动手机中另外一个应用程序的任务。可以发送电子邮件、文本消息或在浏览器中显示Web页面等。但启动器不会向应用程序返回任何数据。
选择器(chooser)
选择器和启动器很相像,而选择器是可以向应用程序返回信息的任务。例如,请求用户拍摄照片或者选择一个电话号码等。
下面列出Windows Phone中的所有任务及返回的数据类型。
调用任务的常见模式是创建一个它的实例,设置所需的属性,然后调用Show方法。例如,使用下面的几行代码调用任务,拍摄照片,并将拍摄的图片设置为grid的背景:
1 arc.EndAngle = 0; 2 CameraCaptureTask nCamera = new CameraCaptureTask(); 3 nCamera.Completed += new EventHandler<PhotoResult>(Camera_Completed); 4 nCamera.Show(); 5 6 void Camera_Completed(object sender, PhotoResult e) 7 { 8 if (e.TaskResult == TaskResult.OK) 9 { 10 if (e.ChosenPhoto != null && e.OriginalFileName.Length > 0) 11 { 12 BitmapImage bitMap = new BitmapImage(); 13 bitMap.SetSource(e.ChosenPhoto); 14 15 ImageBrush imageBrush = new ImageBrush(); 16 imageBrush.ImageSource = bitMap; 17 18 ContentPanel.Background = imageBrush; 19 } 20 } 21 }
对于选择器而言,还要为Completed时间附加一个事件处理程序。当选择器应用程序关闭时,就会调用Completed事件,可以通过事件参数来访问任何返回值。如前所述,由于启动器不返回任何信息,所以无法指示启动器的完成情况。
注意
在浏览每个不同的任务之前,了解Windows Phone应用程序被切换至后台时的行为是至关重要的。因为无论启动器还是选择器调用的时候都会引发墓碑机制的。
如果上述代码是在一个Button的Click方法中创建创建的CameraCaptureTask类的实例。当调用此方法时,会创建CameraCaptureTask,关联事件处理程序,并显示相应的选择器。最后会将焦点从该应用程序移走,并将其切换至后台。
1 private void Button_Click(object sender, RoutedEventArgs e) 2 { 3 CameraCaptureTask nCamera = new CameraCaptureTask(); 4 nCamera.Completed += new EventHandler<PhotoResult>(Camera_Completed); 5 nCamera.Show(); 6 }
如果显示选择器时,应用程序被终止了会发生什么情况?更重要的是,当用户拍完照返回到应用程序时会发生什么?
应用程序会重新启动并导航到当时的页面。在此处会遇到一个问题,即在方法的作用域中定义了选择器任务(如前面的代码片段所示)。由于实例的创建和事件处理程序的关联都只在方法的作用域中,所以系统不知道如何使用选择器任务的结果去调用Camera_Completed方法。
正确的使用方法
使用选择器任务的正确方法是将选择器创建为一个实例级别的变量。在以下代码中,CameraCaptureTask的实例化在MainPage的构造函数中进行,同时在构造函数的结尾处为Completed事件关联处理程序。
1 public partial class MainPage : PhoneApplicationPage 2 { 3 private CameraCaptureTask nCamera = new CameraCaptureTask(); 4 5 public MainPage() 6 { 7 InitializeComponent(); 8 9 this.nCamera.Completed += new EventHandler<PhotoResult>(nCamera_Completed); 10 } 11 12 private void Button_Click(object sender, RoutedEventArgs e) 13 { 14 this.nCamera.Show(); 15 } 16 17 void nCamera_Completed(object sender, PhotoResult e) 18 { 19 ......... 20 } 21 }
在此代码中,当选择器任务完成并重新启动应用程序时,MainPage会创建CameraCaptureTask同时关联Completed事件。为Completed事件关联事件处理程序的过程是为了检查是否有被挂起待引发的事件。当应用程序从选择器返回时确实包含此类事件,所以会调用事件处理程序。