かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

UWPで共有コントラクト 送信側

共有コントラクトってUWPでも言うんですかね?

Windows 8で追加されて、めでたく?Windows 10で廃止されたチャームにあった共有ですが、UWPではアプリから明示的に共有を表示してやる必要があります。それ以外はWindowsストアアプリの頃と変わっていません。(ストアアプリの頃も明示的に自分で共有のUI呼び出せたけど、特に理由がない限りチャームがあったのでする必要はなかった)

手順としては、DataTranferManagerをGetForCurrentViewで取得して、それのDataRequestedイベントを購読する感じです。このイベントは、共有されるときに呼び出されます。あとは、DataTranferManager.ShowShareUI()で共有用のUIを表示してやればOKです。コードだと以下のようになります。 (画面にボタンを1つだけおいてる前提)

using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace App54
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            // データの要求があったときのイベントを購読
            var dtm = DataTransferManager.GetForCurrentView();
            dtm.DataRequested += this.Dtm_DataRequested;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            // イベントの購読解除
            var dtm = DataTransferManager.GetForCurrentView();
            dtm.DataRequested -= this.Dtm_DataRequested;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // 共有のためのUIを表示
            DataTransferManager.ShowShareUI();
        }

        private void Dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
        {
            // 共有するデータを設定する
            args.Request.Data.Properties.Title = "Hello";
            args.Request.Data.Properties.Description = "練習";
            args.Request.Data.SetText("Hello world");

            // 途中に非同期処理とかが入るときは以下のようにDeferralを使う
            // var d = args.Request.GetDeferral();
            // ここで非同期処理でデータをとってきたりする
            // d.Complete();
        }
    }
}

実行してボタンを押すと、以下のように共有のUIが表示されます。

f:id:okazuki:20160315125211p:plain

Aristeaに共有した場合。プログラムでセットしたHello worldが渡されてることがわかります。

f:id:okazuki:20160315125244p:plain