重新想象 Windows 8 Store Apps (39) - 契约: Share Contract

简介: 原文:重新想象 Windows 8 Store Apps (39) - 契约: Share Contract[源码下载] 重新想象 Windows 8 Store Apps (39) - 契约: Share Contract 作者:webabcd介绍重新想象 Windows 8 Store A...
原文: 重新想象 Windows 8 Store Apps (39) - 契约: Share Contract

[源码下载]


重新想象 Windows 8 Store Apps (39) - 契约: Share Contract



作者:webabcd


介绍
重新想象 Windows 8 Store Apps 之 契约

  • Share Contract - 右侧边栏称之为 Charm,其中的“共享”称之为 Share Contract



示例
1、演示如何开发共享源
Contracts/ShareContract/ShareSource.xaml

<Page
    x:Class="XamlDemo.Contracts.ShareContract.ShareSource"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Contracts.ShareContract"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">

            <TextBlock Name="lblMsg" FontSize="14.667" />

            <Button Content="Share Text" Click="Button_Click_1" Margin="0 10 0 0" />

            <Button Content="Share Link" Click="Button_Click_1" Margin="0 10 0 0" />

            <Button Content="Share Image" Click="Button_Click_1" Margin="0 10 0 0" />

            <Button Content="Share File" Click="Button_Click_1" Margin="0 10 0 0" />

            <Button Content="Share Html" Click="Button_Click_1" Margin="0 10 0 0" />

            <Button Content="Share Custom Data" Click="Button_Click_1" Margin="0 10 0 0" />

            <Button Content="Share With Deferral" Click="Button_Click_1" Margin="0 10 0 0" />

        </StackPanel>
    </Grid>
</Page>

Contracts/ShareContract/ShareSource.xaml.cs

/*
 * Share Contract - 右侧边栏称之为 Charm,其中的“共享”称之为 Share Contract
 * 
 * 本例演示如何开发共享源
 * 共享源 - 提供共享数据的 app
 * 共享目标 - 接收并处理共享数据的 app
 * 共享面板 - 点击“共享”后出来的,包含了一堆共享目标的面板
 * 
 * DataTransferManager - 共享数据管理器
 *     GetForCurrentView() - 返回当前窗口关联的 DataTransferManager 对象
 *     ShowShareUI() -  弹出共享面板,以开始共享操作
 *     DataRequested - 共享操作开始时(即弹出共享面板后)所触发的事件,事件参数为 DataTransferManager 和 DataRequestedEventArgs
 *     TargetApplicationChosen - 选中了共享面板上的某个共享目标时所触发的事件,事件参数为 DataTransferManager 和 TargetApplicationChosenEventArgs
 * 
 * TargetApplicationChosenEventArgs - TargetApplicationChosen 的事件参数
 *     ApplicationName - 选中的共享目标的名称
 *     
 * DataRequestedEventArgs - DataRequested 的事件参数
 *     Request - 返回 DataRequest 类型的数据
 *     
 * DataRequest - 一个对象,其包括了共享的内容和错误提示
 *     FailWithDisplayText() - 指定当共享操作失败时,需要在共享面板上显示的提示信息
 *     Data - 需要共享的内容,返回 DataPackage 对象
 *         
 * DataPackage - 共享内容(注:复制到剪切板的内容也是通过此对象来封装)
 *     Properties - 返回 DataPackagePropertySetView 对象
 *         Properties.Title - 共享数据的标题
 *         Properties.Description - 共享数据的描述
 *         Properties.Thumbnail - 共享数据的缩略图
 *         Properties.FileTypes - 获取共享数据中包含的文件类型
 *     SetText(), SetUri(), SetHtmlFormat(), SetRtf(), SetBitmap(), SetStorageItems(), SetData(), SetDataProvider() - 设置需要共享的各种格式的数据,详细用法见下面的相关 demo(注:一个 DataPackage 可以有多种不同格式的数据)
 *     ResourceMap - IDictionary<string, RandomAccessStreamReference> 类型,共享 html 时如果其中包含了本地资源的引用(如引用了本地图片),则需要通过 ResourceMap 传递
 *     GetView() - 返回 DataPackageView 对象,其相当于 DataPackage 的一个只读副本,详细说明见 ShareTarget.xaml.cs
 *     另:WebView.DataTransferPackage 会返回用户选中的内容的 DataPackage 对象,以便分享浏览器内的 html 内容
 *     
 * 异步共享:
 * 1、DataPackage 通过 SetDataProvider() 传递数据,其对应的委托的参数为一个 DataProviderRequest 类型的数据
 * 2、DataProviderRequest.GetDeferral() 用于获取 DataProviderDeferral 对象以开始异步处理,然后通过 DataProviderDeferral.Complete() 通知 DataPackage 已经完成了异步操作
 */

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel.DataTransfer;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using System.Linq;
using Windows.Graphics.Imaging;

namespace XamlDemo.Contracts.ShareContract
{
    public sealed partial class ShareSource : Page
    {
        // 当前需要分享的内容的类型
        private string _shareType = "Share Text";
        // 需要分享的文件集合
        private IReadOnlyList<StorageFile> _selectedFiles;

        public ShareSource()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 初始化 DataTransferManager
            DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
            dataTransferManager.DataRequested += dataTransferManager_DataRequested;
            dataTransferManager.TargetApplicationChosen += dataTransferManager_TargetApplicationChosen;
        }

        void dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
        {
            // 共享操作开始时(即弹出共享面板后),根据需要分享的内容的类型执行指定的方法
            switch (_shareType)
            {
                case "Share Text":
                    ShareText(sender, args);
                    break;
                case "Share Link":
                    ShareLink(sender, args);
                    break;
                case "Share Image":
                    ShareImage(sender, args);
                    break;
                case "Share File":
                    ShareFile(sender, args);
                    break;
                case "Share With Deferral":
                    ShareWithDeferral(sender, args);
                    break;
                case "Share Html":
                    ShareHtml(sender, args);
                    break;
                case "Share Custom Data":
                    ShareCustomData(sender, args);
                    break;
                default:
                    break;
            }

            // 共享操作失败时,在共享面板上显示的提示信息
            // args.Request.FailWithDisplayText("共享操作失败"); 
        }

        void dataTransferManager_TargetApplicationChosen(DataTransferManager sender, TargetApplicationChosenEventArgs args)
        {
            // 显示用户需要与其共享内容的应用程序的名称
            lblMsg.Text = "共享给:" + args.ApplicationName;
        }

        private async void Button_Click_1(object sender, RoutedEventArgs e)
        {
            _shareType = (sender as Button).Content.ToString();

            // 如果需要共享文件,则提示用户选择文件
            if (_shareType == "Share Image" || _shareType == "Share File" || _shareType == "Share With Deferral")
            {
                bool unsnapped = ((ApplicationView.Value != ApplicationViewState.Snapped) || ApplicationView.TryUnsnap());
                if (unsnapped)
                {
                    FileOpenPicker filePicker = new FileOpenPicker
                    {
                        ViewMode = PickerViewMode.List,
                        SuggestedStartLocation = PickerLocationId.PicturesLibrary,
                        FileTypeFilter = { "*" }
                        // FileTypeFilter = { ".jpg", ".png", ".bmp", ".gif", ".tif" }
                    };

                    _selectedFiles = await filePicker.PickMultipleFilesAsync();
                    if (_selectedFiles.Count > 0)
                    {
                        // 弹出共享面板,以开始共享操作
                        DataTransferManager.ShowShareUI();
                    }
                }
            }
            else
            {
                // 弹出共享面板,以开始共享操作
                DataTransferManager.ShowShareUI();
            }
        }

        // 共享文本的 Demo
        private void ShareText(DataTransferManager dtm, DataRequestedEventArgs args)
        {
            DataPackage dataPackage = args.Request.Data;
            dataPackage.Properties.Title = "Title";
            dataPackage.Properties.Description = "Description";
            dataPackage.SetText("需要分享的详细内容");
        }

        // 共享超链的 Demo
        private void ShareLink(DataTransferManager dtm, DataRequestedEventArgs args)
        {
            DataPackage dataPackage = args.Request.Data;
            dataPackage.Properties.Title = "Title";
            dataPackage.Properties.Description = "Description";
            dataPackage.SetUri(new Uri("http://webabcd.cnblogs.com"));
        }

        // 共享图片的 Demo(关于如何为分享的图片减肥请参见本例的“异步共享的 Demo”)
        private void ShareImage(DataTransferManager dtm, DataRequestedEventArgs args)
        {
            DataPackage dataPackage = args.Request.Data;
            dataPackage.Properties.Title = "Title";
            dataPackage.Properties.Description = "Description";

            // 分享选中的所有文件中的第一个文件(假设其是图片)
            RandomAccessStreamReference imageStreamRef = RandomAccessStreamReference.CreateFromFile(_selectedFiles.First());
            dataPackage.Properties.Thumbnail = imageStreamRef;
            dataPackage.SetBitmap(imageStreamRef);
        }

        // 共享文件的 Demo
        private void ShareFile(DataTransferManager dtm, DataRequestedEventArgs args)
        {
            DataPackage dataPackage = args.Request.Data;
            dataPackage.Properties.Title = "Title";
            dataPackage.Properties.Description = "Description";
            dataPackage.SetStorageItems(_selectedFiles);
        }

        // 共享 html 的 Demo
        private void ShareHtml(DataTransferManager dtm, DataRequestedEventArgs args)
        {
            string localImage = "ms-appx:///Assets/Logo.png";
            string htmlExample = "<p><b>webabcd</b><img src=\"" + localImage + "\" /></p>";
            // 为 html 添加共享所需的必要的标头,以保证可以正常进行 html 的共享操作
            string htmlFormat = HtmlFormatHelper.CreateHtmlFormat(htmlExample);

            DataPackage dataPackage = args.Request.Data;
            dataPackage.Properties.Title = "Title";
            dataPackage.Properties.Description = "Description";
            dataPackage.SetHtmlFormat(htmlFormat);

            // 设置本地图像数据(如果需要共享的 html 包含本地图像,则只能通过这种方法共享之)
            RandomAccessStreamReference streamRef = RandomAccessStreamReference.CreateFromUri(new Uri(localImage));
            dataPackage.ResourceMap[localImage] = streamRef;

            /*
             * 以下演示如何共享 WebView 中的被用户选中的 html
             * 具体可参见:Controls/WebView/Share.xaml
             * 
            DataPackage dataPackage = WebView.DataTransferPackage;
            DataPackageView dataPackageView = dataPackage.GetView();

            if ((dataPackageView != null) && (dataPackageView.AvailableFormats.Count > 0))
            {
                dataPackage.Properties.Title = "Title";
                dataPackage.Properties.Description = "Description";
            
                args.Request.Data = dataPackage;
            }
            */
        }

        // 共享自定义数据的 Demo
        private void ShareCustomData(DataTransferManager dtm, DataRequestedEventArgs args)
        {
            DataPackage dataPackage = args.Request.Data;
            dataPackage.Properties.Title = "Title";
            dataPackage.Properties.Description = "Description";

            // 指定需要分享的自定义数据,第一个参数是自定义数据的格式 id(注:标准格式 id 在 Windows.ApplicationModel.DataTransfer.StandardDataFormats 枚举)
            // 要让自定义数据可以正常分享,需要在 Package.appxmanifest 中的“共享目标”声明中对自定义格式 id 做相应的配置,以及在 SourceTarget 对自定义格式 id 做相应的处理
            dataPackage.SetData("http://webabcd/sharedemo", "自定义数据");
        }

        // 异步共享的 Demo(在共享内容需要较长时间才能计算出来的场景下,应该使用异步共享)
        private void ShareWithDeferral(DataTransferManager dtm, DataRequestedEventArgs args)
        {
            DataPackage dataPackage = args.Request.Data;
            dataPackage.Properties.Title = "Title";
            dataPackage.Properties.Description = "Description";

            dataPackage.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(_selectedFiles.First());
            // 通过委托来提供共享数据,当用户点击了共享目标后会调用此委托,即不马上提供共享数据,而是等到用户点击了共享目标后再异步准备数据
            dataPackage.SetDataProvider(StandardDataFormats.Bitmap, providerRequest => this.OnDeferredImageRequestedHandler(providerRequest, _selectedFiles.First()));
        }

        // 用户点击了共享目标后会调用此方法
        private async void OnDeferredImageRequestedHandler(DataProviderRequest providerRequest, StorageFile imageFile)
        {
            // 获取 DataProviderDeferral,以开始异步处理,即在此之后允许调用 await 方法
            DataProviderDeferral deferral = providerRequest.GetDeferral();
            InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();

            try
            {
                // 将用户选中的图片缩小一倍,然后再共享
                IRandomAccessStream imageStream = await imageFile.OpenAsync(FileAccessMode.Read);
                BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(imageStream);
                BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
                imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
                imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
                await imageEncoder.FlushAsync();

                // 停 3 秒,以模拟长时间任务
                await Task.Delay(3000);

                providerRequest.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
            }
            finally
            {
                // 通知 DataPackage 已经完成了共享数据的准备
                deferral.Complete();
            }
        }
    }
}


2、演示如何开发共享目标
Contracts/ShareContract/ShareTarget.xaml

<Page
    x:Class="XamlDemo.Contracts.ShareContract.ShareTarget"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Contracts.ShareContract"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="#438bdf">

        <ScrollViewer Name="scrollView" Margin="120 0 0 0">
            <StackPanel>
                <TextBlock Name="lblMsg" FontSize="14.667" />

                <Image Name="imgThumbnail" Margin="0 10 0 0" />

                <Image Name="imgBitmap" Margin="0 10 0 0" />
                
                <Button Content="新增一个 QuickLink,并完成共享操作" Click="Button_Click_1" Margin="0 10 0 0" />
            </StackPanel>
        </ScrollViewer>
        
    </Grid>
</Page>

Contracts/ShareContract/ShareTarget.xaml.cs

/*
 * Share Contract - 右侧边栏称之为 Charm,其中的“共享”称之为 Share Contract
 * 
 * 本例演示如何开发共享目标
 * 1、在 Package.appxmanifest 中新增一个“共享目标”声明,并做相关配置
 * 2、在 App.xaml.cs 中 override void OnShareTargetActivated(ShareTargetActivatedEventArgs args),以获取相关的共享信息
 * 
 * ShareTargetActivatedEventArgs - 当 app 由共享激活时的事件参数
 *     ShareOperation - 返回一个 ShareOperation 类型的对象
 *     PreviousExecutionState - 此 app 被共享激活前的执行状态(ApplicationExecutionState 枚举:NotRunning, Running, Suspended, Terminated, ClosedByUser)
 *     SplashScreen - 启动画面对象
 * 
 * ShareOperation - 共享操作的相关信息
 *     Data - 返回 DataPackageView 对象,其相当于 DataPackage 的一个只读副本
 *     QuickLinkId - 如果是 QuickLink 激活的,此属性可获取此 QuickLink 的 Id
 *     RemoveThisQuickLink() - 如果是 QuickLink 激活的,此方法可删除此 QuickLink
 *     ReportCompleted() - 通知系统共享操作已经完成(会自动关闭共享面板),需要的话可以指定一个需要增加的 QuickLink 对象
 *     ReportStarted(), ReportDataRetrieved(), ReportError(), ReportSubmittedBackgroundTask() - 顾名思义的一些方法,用不用皆可,它们的作用是可以帮助系统优化资源的使用
 * 
 * DataPackage 对象的只读版本,从剪切板获取数据或者共享目标接收数据均通过此对象来获取 DataPackage 对象的数据
 *     AvailableFormats - DataPackage 中数据所包含的所有格式
 *     Contains() - 是否包含指定格式的数据
 *     Properties - 返回 DataPackagePropertySetView 对象,就是由共享源所设置的一些信息,参见 ShareSource.xaml.cs
 *     GetTextAsync(), GetUriAsync(), GetRtfAsync(), GetHtmlFormatAsync(), GetBitmapAsync(), GetStorageItemsAsync(), GetDataAsync(), GetResourceMapAsync() - 获取共享过来的各种格式的数据,详细用法见下面的相关 demo(注:一个 DataPackage 可以有多种不同格式的数据)
 *     
 * QuickLink - 预定义了一些数据,指向相应共享目标的一个快捷方式,其会出现在共享面板的上部
 *     Id - 预定义数据
 *     Title - QuickLink 出现在共享面板上的时候所显示的名称
 *     Thumbnail - QuickLink 出现在共享面板上的时候所显示的图标
 *     SupportedDataFormats - 共享数据中所包含的数据格式与 SupportedDataFormats 定义的相匹配(两个集合中的元素有一个匹配即可),QuickLink 才会出现在共享面板上
 *     SupportedFileTypes - 共享数据中所包含的文件的扩展名与 SupportedDataFormats 定义的相匹配(两个集合中的元素有一个匹配即可),QuickLink 才会出现在共享面板上
 *     
 * QuickLink 的适用场景举例
 * 1、当用户总是共享信息到某一个邮件地址时,便可以此邮件地址为 QuickLinkId 生成一个 QuickLink
 * 2、下回用户再想共享信息到此邮件地址时,就可点此 QuickLink 来启动共享操作
 * 3、共享目标被 QuickLink 激活后便可以解析 QuickLink 中的 Id,即用户需要共享到的邮件地址,从而避免用户输入此邮件地址,从而方便用户的共享操作
 */

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.DataTransfer.ShareTarget;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Core;
using Windows.UI.Popups;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Navigation;

namespace XamlDemo.Contracts.ShareContract
{
    public sealed partial class ShareTarget : Page
    {
        private ShareOperation _shareOperation;

        public ShareTarget()
        {
            this.InitializeComponent();
        }

        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 获取 ShareOperation 对象
            ShareTargetActivatedEventArgs shareTargetActivated = (ShareTargetActivatedEventArgs)e.Parameter;
            if (shareTargetActivated == null)
            {
                lblMsg.Text = "为了演示共享目标,请从共享源激活本页面";
                return;
            }
            _shareOperation = shareTargetActivated.ShareOperation;

            // 异步获取共享数据
            await Task.Factory.StartNew(async () =>
            {
                // 显示共享数据中相关信息
                OutputMessage("QuickLinkId: " + _shareOperation.QuickLinkId);
                OutputMessage("Title: " + _shareOperation.Data.Properties.Title);
                OutputMessage("Description: " + _shareOperation.Data.Properties.Description);
                ShowThumbnail(_shareOperation.Data.Properties.Thumbnail);

                // 如果共享数据中包含 Text 格式数据,则显示之
                if (_shareOperation.Data.Contains(StandardDataFormats.Text))
                {
                    try
                    {
                        var text = await _shareOperation.Data.GetTextAsync();
                        OutputMessage("Text: " + text);
                    }
                    catch (Exception ex)
                    {
                        OutputMessage(ex.ToString());
                    }
                }
                // 如果共享数据中包含 Uri 格式数据,则显示之
                if (_shareOperation.Data.Contains(StandardDataFormats.Uri))
                {
                    try
                    {
                        var uri = await _shareOperation.Data.GetUriAsync();
                        OutputMessage("Uri: " + uri.AbsoluteUri);
                    }
                    catch (Exception ex)
                    {
                        OutputMessage(ex.ToString());
                    }
                }
                // 如果共享数据中包含 Bitmap 格式数据,则显示之
                if (_shareOperation.Data.Contains(StandardDataFormats.Bitmap))
                {
                    try
                    {
                        IRandomAccessStreamReference stream = await _shareOperation.Data.GetBitmapAsync();
                        ShowBitmap(stream);
                    }
                    catch (Exception ex)
                    {
                        OutputMessage(ex.ToString());
                    }
                }
                // 如果共享数据中包含 Html 格式数据,则显示之
                if (_shareOperation.Data.Contains(StandardDataFormats.Html))
                {
                    try
                    {
                        // 获取 html 数据
                        var html = await _shareOperation.Data.GetHtmlFormatAsync();
                        OutputMessage("Html: " + html);

                        // 获取 html 中包含的本地资源的引用(如引用的本地图片等),其数据在分享源的 DataPackage.ResourceMap 中设置
                        IReadOnlyDictionary<string, RandomAccessStreamReference> sharedResourceMap = await _shareOperation.Data.GetResourceMapAsync();
                    }
                    catch (Exception ex)
                    {
                        OutputMessage(ex.ToString());
                    }
                }
                // 如果共享数据中包含 StorageItems 格式数据,则显示之
                if (_shareOperation.Data.Contains(StandardDataFormats.StorageItems))
                {
                    try
                    {
                        var storageItems = await _shareOperation.Data.GetStorageItemsAsync();
                        foreach (var storageItem in storageItems)
                        {
                            OutputMessage("storageItem: " + storageItem.Path);
                        }
                    }
                    catch (Exception ex)
                    {
                        OutputMessage(ex.ToString());
                    }
                }
                // 如果共享数据中包含“http://webabcd/sharedemo”格式数据,则显示之
                if (_shareOperation.Data.Contains("http://webabcd/sharedemo"))
                {
                    try
                    {
                        var customData = await _shareOperation.Data.GetTextAsync("http://webabcd/sharedemo");
                        OutputMessage("Custom Data: " + customData);
                    }
                    catch (Exception ex)
                    {
                        OutputMessage(ex.ToString());
                    }
                }
            });
        }

        // 在 UI 上输出指定的信息
        async private void OutputMessage(string message)
        {
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                lblMsg.Text += message;
                lblMsg.Text += Environment.NewLine;
            });
        }

        // 显示图片
        async private void ShowThumbnail(IRandomAccessStreamReference thumbnail)
        {
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
            {
                if (thumbnail != null)
                {
                    IRandomAccessStreamWithContentType thumbnailStream = await thumbnail.OpenReadAsync();
                    BitmapImage bitmapImage = new BitmapImage();
                    bitmapImage.SetSource(thumbnailStream);

                    imgThumbnail.Source = bitmapImage;
                }
            });
        }

        // 显示图片
        async private void ShowBitmap(IRandomAccessStreamReference bitmap)
        {
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
            {
                if (bitmap != null)
                {
                    IRandomAccessStreamWithContentType bitmapStream = await bitmap.OpenReadAsync();
                    BitmapImage bitmapImage = new BitmapImage();
                    bitmapImage.SetSource(bitmapStream);

                    imgBitmap.Source = bitmapImage;
                }
            });
        }

        // 演示如何增加一个 QuickLink
        private async void Button_Click_1(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            QuickLink quickLink = new QuickLink
            {
                Id = "我是预定义数据,避免用户再次输入",
                Title = "QuickLink Title",

                SupportedFileTypes = { "*" },
                SupportedDataFormats =
                {
                    StandardDataFormats.Text,
                    StandardDataFormats.Uri,
                    StandardDataFormats.Bitmap,
                    StandardDataFormats.StorageItems,
                    StandardDataFormats.Html,
                    "http://webabcd/sharedemo"
                }
            };

            try
            {
                // 设置 QuickLink 的图标
                StorageFile iconFile = await Package.Current.InstalledLocation.CreateFileAsync("Assets\\Logo.png", CreationCollisionOption.OpenIfExists);
                quickLink.Thumbnail = RandomAccessStreamReference.CreateFromFile(iconFile);

                // 完成共享操作,同时增加一个指定的 QuickLink
                _shareOperation.ReportCompleted(quickLink);
            }
            catch (Exception ex)
            {
                OutputMessage(ex.ToString());
            }
        }
    }
}


3、通过共享激活应用程序
App.xaml.cs

// 通过共享激活应用程序时所调用的方法
protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
    var rootFrame = new Frame();
    rootFrame.Navigate(typeof(MainPage), args);
    Window.Current.Content = rootFrame;

    Window.Current.Activate();
}



OK
[源码下载]

目录
相关文章
|
13天前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
37 11
|
3月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
3月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
3月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
3月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
3月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
3月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
|
存储 Windows 容器

热门文章

最新文章