共有コントラクトって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が表示されます。
Aristeaに共有した場合。プログラムでセットしたHello worldが渡されてることがわかります。