新时尚Windows8开发(11):共享目标示例
老周的博客http://blog.csdn.net/tcjiaan,转载请注明原作者和出处。
上一篇文章中,我们吹了一下共享数据的问题,后面还简单弄了一个例子,本文我们再做一个综合一些的例子,咱们做一个全能共享目标,该目标应用可以接收各种格式的数居。
先来认识一个类,该类可以告诉我们标准数据有哪些——StandardDataFormats,这是一个静态类,位于Windows.ApplicationModel.DataTransfer下,意味着,它的所有成员都是静态的,看下图。
它的一系列静成员已经告诉我们六种标准数据格式,相信不用介绍了,看名字就知道了。StorageItems一般指存储在计算机中的文件。
本例启用了五种格式的协定(除rtf外),可以接受多种共享数据,先看看运行的结果。
情景1:启动Bing应用,搜索一些图片,选择其中一张,然后把鼠标移到屏幕的右上角或右下角,待出现侧边栏后选择“共享”。
情景2:打开浏览器,随便打开一个页面。可获取到页面的URI。
情景3:打开“网易云阅读”应用,随便打开一篇文章,然后共享,得到共享字符串。
实现步骤如下:
1、启动VS,新建一个项目,此处省略45个字。
2、打开清单文件Package.appxmanifest,切换到“声明”,在列表中选择“共享目标”,单击“添加”按钮。
在右边的框架中,添加五个数据格式的支持。
3、打开MainPage.xaml,输入以下XAML。
<Page x:Class="MyApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:MyApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <Canvas Name="cvText" Visibility="Collapsed"> <TextBox Name="txtText" Canvas.Left="24" Canvas.Top="12" Width="860" Height="450" TextWrapping="Wrap"/> </Canvas> <Canvas Name="cvBitmap" Visibility="Collapsed"> <Image Name="img" Canvas.Top="20" Canvas.Left="24" Stretch="Uniform" Width="900"/> </Canvas> <TextBlock Name="tbFomats" VerticalAlignment="Bottom" HorizontalAlignment="Left" FontSize="24" Canvas.ZIndex="10" TextWrapping="Wrap"/> </Grid></Page>
4、打开MainPage.xaml.cs,为App类重写OnShareTargetActivated,为了好看,就另外定义一个部分类。
public sealed partial class App : Application { protected override void OnShareTargetActivated(Windows.ApplicationModel.Activation.ShareTargetActivatedEventArgs args) { ShareOperation op = args.ShareOperation; Frame root = Window.Current.Content as Frame; if (root == null) { root = new Frame(); root.Navigate(typeof(MainPage), op); } Window.Current.Content = root; Window.Current.Activate(); } }
5、MainPage.xaml.cs剩下的代码如下。
using Windows.UI.Xaml.Data;using Windows.UI.Xaml.Input;using Windows.UI.Xaml.Media;using Windows.UI.Xaml.Navigation;using Windows.ApplicationModel.DataTransfer;using Windows.ApplicationModel.DataTransfer.ShareTarget;using Windows.Storage;using Windows.Storage.Streams;namespace MyApp{ /// <summary> /// 可用于自身或导航至 Frame 内部的空白页。 /// </summary> public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter is ShareOperation) { ShareOperation op = (ShareOperation)e.Parameter; DataPackageView pv = op.Data; // 显示包含格式 IReadOnlyList<string> listFormats = pv.AvailableFormats; string formatsStr = string.Join("\t", listFormats.ToArray()); tbFomats.Text = formatsStr; // 根据获取到不同的数据格式做相应处理 if (pv.Contains(StandardDataFormats.Bitmap)) { RandomAccessStreamReference strRef = await pv.GetBitmapAsync(); IRandomAccessStreamWithContentType stream = await strRef.OpenReadAsync(); // 读出图片 Windows.UI.Xaml.Media.Imaging.BitmapImage bmp=new Windows.UI.Xaml.Media.Imaging.BitmapImage(); bmp.SetSource(stream); this.img.Source=bmp; cvText.Visibility = Windows.UI.Xaml.Visibility.Collapsed; cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Visible; } else if (pv.Contains(StandardDataFormats.Text)) { string value = await pv.GetTextAsync(); txtText.Text = value; cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed; cvText.Visibility = Windows.UI.Xaml.Visibility.Visible; } else if (pv.Contains(StandardDataFormats.Uri)) { Uri xuri = await pv.GetUriAsync(); txtText.Text = xuri.ToString(); cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed; cvText.Visibility = Windows.UI.Xaml.Visibility.Visible; } else if (pv.Contains(StandardDataFormats.Html)) { string html = HtmlFormatHelper.GetStaticFragment(await pv.GetHtmlFormatAsync()); txtText.Text = html; cvText.Visibility = Windows.UI.Xaml.Visibility.Visible; cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed; } else if (pv.Contains(StandardDataFormats.StorageItems)) { IReadOnlyList<IStorageItem> items = await pv.GetStorageItemsAsync(); string files = string.Empty; foreach (var item in items) { files += item.Name + "\n"; } txtText.Text = files; cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed; cvText.Visibility = Windows.UI.Xaml.Visibility.Visible; } } } }
上面代码中,把ShareOperation作为导航的参数传递给主页面,在MainPage中的OnNavigatedTo获取。
好了,就这样。88