启动器和选择器学习-----(6)Extras <wp7 7.1版本中的使用方法>
相信很多WP的用户都注意到了在我们的图片和音乐+视频中的主全景视图中的应用程序里发现很多第三方的程序在这个列表里,那就是Extras的实现。
Extras是一个为现有Windows Phone应用程序提供额外功能的应用程序。例如,如果您将应用程序注册为PhotosExtrasApplication,就可以在Photos应用程序中调用它来提供额外的功能。
下面我们就以图片的扩展(Pictures Extensibility)为例:
1、Pictures Hub:提供用户透过Pictures Hub中「apps pivot page」执行自己开发的Photo Application
2、Picture Viewer:提供用户可以在Picture Viewer中的「apps link」选择到自己的Photo Application,透过每一张图片的link URI与Token,将它们传递到自己的Application进行呈现
3、Share Picker:提供用户可以在Picture Viewer中的「share link」选择特定的图像分享到指定的Web Service;它与Pictue Viewer的作法相同,采用将图片的link URI与Token送到自己的Photo Application,并且将图片分享出去。
对图片的扩展有了了解以后,接下来说明要怎么使用这三个应用
1、在App的「WMAppManifest.xml」文件里,声明扩充。
1 ..................... 2 <Extensions> 3 <Extension ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" ExtensionName="Photos_Extra_Hub" TaskID="_default" /> 4 <Extension ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" ExtensionName="Photos_Extra_Viewer" TaskID="_default" /> 5 <Extension ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" ExtensionName="Photos_Extra_Share" TaskID="_default" /> 6 </Extensions> 7 </App> 8 </Deployment>
Extensions标签中的每个属性定义如下
属性名称 | 类型 | 说明 |
ConsumerID | GUID |
特定的Conumser识别值,做为与App Connect连结的识别; 所有图片扩充(Picture Extensions)使用相同的Value: 5B04B775-356B-4AA0-AAF8-6491FFEA5632. 所有搜寻扩充(Search Extensions)使用相同的Value: 5B04B775-356B-4AA0-AAF8-6491FFEA5661. |
ExtensionName | String | 做为识别值,用于指定Picture extension支援的类型。 其值可以为:Photos_Extra_Hub, Photos_Extra_Viewer, or Photos_Extra_Share。 |
TaskID | String | 如果有被定义特定的TaskID,当在在选择路由时会指定该TaskID; 如果没有设定,则采用_default; |
2、Picture Hub进行扩充应用:
需要在App的「WMAppManifest.xml」文件里,声明扩充就可以了。ExtensionName为Photos_Extra_Hub
1 <Extensions> 2 <Extension ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" ExtensionName="Photos_Extra_Hub" TaskID="_default" /> 3 </Extensions>
3、Picture Viewer进行扩充应用:
需要在App的「WMAppManifest.xml」文件里,声明扩充就可以了。ExtensionName为Photos_Extra_Viewer。
注意:Picture Viewer会将图片的资讯变成一个参数:「token」透过Link URI将参数传入App之中,该token中的值则代表目前开启图片在MediaLibrary中的相关资讯,可以再将它放入App中的图片元件提供更丰富的操作。
因此,我们要覆写OnNavigateTo的事件,由于Photo Viewer将透过NavigateService的QueryString将token的资讯带入程式中。使用"token"为key。)
1 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 2 { 3 //Photo Viewer app... 使用"token"为key 4 if (NavigationContext.QueryString.ContainsKey("token")) 5 { 6 //通过MediaLibrary获取token代表在Photo Hub中的代表的图片 7 MediaLibrary tLibrary = new MediaLibrary(); 8 Picture tPicture = tLibrary.GetPictureFromToken(NavigationContext.QueryString["token"]); 9 10 BitmapImage tBitmap = new BitmapImage(); 11 tBitmap.CreateOptions = BitmapCreateOptions.None; 12 tBitmap.SetSource(tPicture.GetImage()); 13 WriteableBitmap picLibraryImage = new WriteableBitmap(tBitmap); 14 GenerateMirrorImage(picLibraryImage);//图片翻转 15 } 16 17 base.OnNavigatedTo(e); 18 } 19 private void GenerateMirrorImage(WriteableBitmap nWriteableBitmap) 20 { 21 nWriteableBitmap.Invalidate(); 22 23 int pixelPosition = 0;//起始位置 24 int reversePosition = nWriteableBitmap.PixelWidth * nWriteableBitmap.PixelHeight;//结束位置 25 int pixlValue; 26 //取高度的中心线为准,上下对换。 27 for (int i = 0; i < nWriteableBitmap.PixelHeight / 2; i++) 28 { //取最后一行的第一个元素的下标 29 reversePosition -= nWriteableBitmap.PixelWidth; 30 for (int j = 0; j < nWriteableBitmap.PixelWidth; j++) 31 { 32 pixlValue = nWriteableBitmap.Pixels[reversePosition]; 33 nWriteableBitmap.Pixels[reversePosition] = nWriteableBitmap.Pixels[pixelPosition]; 34 nWriteableBitmap.Pixels[pixelPosition] = pixlValue; 35 36 pixelPosition++; 37 reversePosition++; 38 } 39 //取倒数第二行的第一个元素的下标 40 reversePosition -= nWriteableBitmap.PixelWidth; 41 } 42 this.ImageDes.Source = nWriteableBitmap; 43 }
4、Picture Viewer中的share选项进行扩充应用:
需要在App的「WMAppManifest.xml」文件里,声明扩充就可以了。ExtensionName为Photos_Extra_Share。
Picture Viewer进行扩充应用中会向app「token」,而通过share…选择自己的App时,Picture Viewer会将图片的资讯变成一个参数:「FileId」通过Link URI将参数传入App之中
1 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 2 { 3 if (NavigationContext.QueryString.ContainsKey("FileId")) 4 { 5 MediaLibrary tLibrary = new MediaLibrary(); 6 Picture tPicture = tLibrary.GetPictureFromToken(NavigationContext.QueryString["FileId"]); 7 8 BitmapImage tBitmap = new BitmapImage(); 9 tBitmap.CreateOptions = BitmapCreateOptions.None; 10 tBitmap.SetSource(tPicture.GetImage()); 11 WriteableBitmap picLibraryImage = new WriteableBitmap(tBitmap); 12 //Image控件 13 this.ImageDes.Source = picLibraryImage; 14 15 if (NavigationContext.QueryString.ContainsKey("Action")) 16 { 17 string tAction = NavigationContext.QueryString["Action"]; 18 Dispatcher.BeginInvoke(() => 19 { 20 MessageBox.Show(tAction); 21 }); 22 } 23 } 24 25 base.OnNavigatedTo(e); 26 }
另外,如果当应用程式执行时,想知道目前进入应用程式是通过Photo Viewer进入或是来自应用程式清单(Start画面的清单),可以通过QueryString中的「Action」key来识别,如果存在且值为「ShareContent」代表是来自Photo Viewer。
源码下载: