IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Windows 10 UWP开发:分享图片功能的实现

    汪宇杰发表于 2016-02-17 05:23:09
    love 0

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

     



沪ICP备19023445号-2号
友情链接