kazuakix の日記

Windows Phone とか好きです

Windows Phone でテキストを共有する方法

あ…ありのまま 今 起こった事を話すぜ!

「おれは 帰宅して Office 365 ネタでブログを書こうとししていたら 共有チャームを調べる事になっていた」


コンテンツ共有の基本

という訳でコンテンツ共有について確認しておきます。

Windows Phone でのコンテンツ共有は Windows と共通 (というか Windows ランタイムなので同じ) で DataPackage クラスを使用します。DataPackage にはテキストや画像、URL など様々なデータを渡すことができますが、今回は一番単純なテキストの共有を試してみました。

前準備

共有を有効にしたい画面の OnNavigatedTo で DataTransferManager のインスタンスを取得します。コンテンツが共有されるときは取得した DataTransferManager オブジェクトの DataRequested イベントが呼び出されます。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    this._navigationHelper.OnNavigatedTo(e);

    this._dataTransferManager = DataTransferManager.GetForCurrentView();
    this._dataTransferManager.DataRequested += this.ViewModel.OnDataRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    this._dataTransferManager.DataRequested -= this.ViewModel.OnDataRequested;

    this._navigationHelper.OnNavigatedFrom(e);
}

一応、OnNavigatedFrom で後始末もしています。
 

呼び出し

DataTransferManager から呼び出される中身です。
引数として渡される DataRequestedEventArgs.Request に共有したいコンテンツをセットすることになります

public void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    if (GetShareContent(args.Request))
    {
        if (String.IsNullOrEmpty(args.Request.Data.Properties.Title))
        {
            //args.Request.FailWithDisplayText("タイトルが入ってないよ");
            System.Diagnostics.Debug.Assert(false, "タイトルが入ってないよ");
        }
    }
}

private bool GetShareContent(DataRequest request)
{
    bool succeeded = false;

    if (!String.IsNullOrEmpty(this.Body))
    {
        DataPackage requestData             = request.Data;
        requestData.Properties.Title        = this.Title;
        requestData.Properties.Description  = this.Description;
        requestData.SetText(this.Body);
        succeeded = true;
    }
    else
    {
        //request.FailWithDisplayText("共有したいテキストを入れてね");
        System.Diagnostics.Debug.Assert(false, "共有したいテキストを入れてね");
    }
    return succeeded;
}

Windows との唯一の違いは DataRequest.FailWithDisplayText でエラーを返す知らせる仕組みが無いので別の方法を考える必要があることでしょうか。
 

共有の実行

Windows の場合は共有チャームを表示すればいいのですが、Phone にはチャームが無いので適当なボタン等を押したときに共有が実行されるようにします。(余談ですが、アプリバー用の "共有" アイコン無いんですね...)

private void OnShareButtonClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    DataTransferManager.ShowShareUI();
}

 
実際に実行してみるとこんな感じ。

ボタンを押すことでテキストを共有可能なアプリの一覧が表示され、テキストを渡すことができました。
f:id:kazuakix:20141105004403j:plain,w360
f:id:kazuakix:20141105004408j:plain,w360

やっつけですが、ソース置いておきます。