読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

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