Windows 8开始,Windows Store应用的一大特色就是可以通过Charm Bar里面的Share功能把数据分享到另一个应用。虽然在Windows 10里面,Charm Bar已经被撸掉了,但是分享的接口还在,还是可以从屏幕右边弹出和Windows 8一样的分享界面出来。
比如我昨天更新的《描图》应用,就可以将墨迹分享到OneNote、Outlook等应用中去。
今天我给《上海轨道交通》也添加了分享站层图的功能。下面就是实现过程。
首先,Windows Store应用的分享,用的是DataTransferManager
对象。在要分享数据的页面里先爆一个全局变量出来:
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
然后因为我们分享的是图片,所以要爆一个临时文件来保存图片数据,WINRT的文件模型是StorageFile,同样爆到一个私有变量里去:
private StorageFile _tempExportFile;
然后,我们要给DataTransferManager的DataRequested事件爆一些神奇的代码进去,我一般在构造函数里完成事件注册:
dataTransferManager.DataRequested += DataTransferManager_DataRequested;
实现如下:
private async void DataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { try { DataPackage requestData = args.Request.Data; requestData.Properties.Title = "站层图"; requestData.Properties.Description = "上海轨道交通站层图"; List<IStorageItem> imageItems = new List<IStorageItem> { _tempExportFile }; requestData.SetStorageItems(imageItems); RandomAccessStreamReference imageStreamRef = RandomAccessStreamReference.CreateFromFile(_tempExportFile); requestData.Properties.Thumbnail = imageStreamRef; requestData.SetBitmap(imageStreamRef); } catch (Exception ex) { await new MessageDialog(ex.Message, "爆了").ShowAsync(); } }
其中,requestData.Properties.Title就是分享内容的标题,它会出现在OneNote的标题栏和Outlook邮件的主题中。
requestData.Properties.Thumbnail是缩略图,需要爆成RandomAccessStreamReference类型才能认,stupid!
最后一步就是把图片的stream爆到DataPackage里去:requestData.SetBitmap(imageStreamRef);
那么这个图片的Stream要怎么来呢?
如果你引入了我的Edi.UWP.Helpers助手类库,那就最方便了:
第一步:把你的图片文件撸成WriteableBitmap
var rmbp = await Utils.LoadWriteableBitmap(图片文件路径);
第二部:创建一个临时文件
StorageFile tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("ShanghaiMetro_Temp.png", CreationCollisionOption.ReplaceExisting);
第三部:把图片撸到这个临时文件里
await rmbp.SaveStorageFile(tempFile);
怎么样?简单吧!完全不需要知道实现细节。如果你想学习的话,这个助手类库也是开源的:
https://github.com/EdiWang/UWP-Helpers
最后,点击分享按钮,弹出分享界面的代码就这么简单:
private async void BtnShare_OnClick(object sender, RoutedEventArgs e) { var rmbp = await Utils.LoadWriteableBitmap(CurrentStationMapUri.AbsolutePath.Substring(1, CurrentStationMapUri.AbsolutePath.Length - 1)); StorageFile tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("ShanghaiMetro_Temp.png", CreationCollisionOption.ReplaceExisting); await rmbp.SaveStorageFile(tempFile); _tempExportFile = tempFile; DataTransferManager.ShowShareUI(); }