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();
}