共有ターゲット

 Metro Style App では、共有コントラクトを使ってアプリ間でデータを受け渡す事ができます。
 以前、共有ソースとしてデータを渡す方法について試しましたので、今回は共有ターゲットとしてデータを受け取る側について試してみたいと思います。

 共有ターゲットとして動作させるためにはアプリケーションマニフェストでの宣言等が必要ですが、機能を追加するためのテンプレートが用意されていますので、テンプレートを使って追加します。

 新しい項目の追加で“共有ターゲット コントラクト”を選択します。


 このテンプレートで以下のような項目が追加され、基本的な共有ターゲット機能が動作するようになります。

  • アプリケーションマニフェストに共有ターゲットの宣言が追加されます。
  • 共有ターゲット用のページ(xaml、cs)が追加されます。ページには受け取ったデータのタイトル等を表示する処理が追加されています。
  • アプリケーションクラスに共有ターゲットとして起動された時に呼び出されるメソッドが追加されます。メソッドには共有ターゲット用のページを表示する処理が追加されます。


 このままでもデータを受け取ってタイトル等を表示する事ができますが、受け取るデータ形式を追加してみたいと思います。

 受け取れるデータ形式は、予め定義されている形式としてbitmap、html、rtf、text、uriがあり、独自形式のデータも受け取れます。
 また、ファイルについてはすべてを受け取る事もできますし、拡張子を指定して特定の種類のファイルだけを受け取るようにする事もできます。

 受け取るフォーマットを追加するためには、アプリケーションマニフェストの宣言を表示してデータ形式を追加します。
 初期状態ではデータ形式は未登録で、“すべてのファイルの種類をサポートする”にチェックが入っている状態になっています。
 今回はデータ形式としてuriとbitmapを追加します。


 データ形式を追加しましたので、受け取ったデータを表示するためにTextBlockを1つ追加します。Title、Descriptionを表示するTextBlockが最初から定義されていますので、その下にTextを表示するTextBlockを追加します。

<TextBlock
    Text="{Binding Description}"
    MaxHeight="60"
    Foreground="{StaticResource ApplicationSecondaryTextBrush}"
    Style="{StaticResource BodyTextStyle}"/>
<TextBlock
    Text="{Binding Text}"
    Margin="0,20"
    Foreground="{StaticResource ApplicationSecondaryTextBrush}"
    Style="{StaticResource BodyTextStyle}"/>

 最後に受け取ったデータをデータ形式に応じて処理し画面に表示するコードを追加します。
 データ形式に関わらず共通して取得できるTitle、Descriptionは最初から表示する処理が記述されていますので、その他の文字情報と画像を受け取ったデータから生成します。

  • データがuriの場合、Uri文字列を表示します。
  • データがbitmapの場合、BitmapImageに設定して画像を表示します。
  • データがファイルの場合は、ファイル名を表示します。
public async void Activate(ShareTargetActivatedEventArgs args)
{
    this._shareOperation = args.ShareOperation;

    // Communicate metadata about the shared content through the view model
    var shareProperties = this._shareOperation.Data.Properties;
    var thumbnailImage = new BitmapImage();

    if (this._shareOperation.Data.Contains(StandardDataFormats.Uri))
    {
        Uri uri = await this._shareOperation.Data.GetUriAsync();
        if (uri != null)
        {
            this.DefaultViewModel["Text"] = "Uri: " + uri.AbsoluteUri;
        }
    }
    if (this._shareOperation.Data.Contains(StandardDataFormats.Bitmap))
    {
        var streamRef = await this._shareOperation.Data.GetBitmapAsync();
        var stream = await streamRef.OpenReadAsync();
        thumbnailImage.SetSource(stream);
    }
    if (this._shareOperation.Data.Contains(StandardDataFormats.StorageItems))
    {
        var storageItems = await this._shareOperation.Data.GetStorageItemsAsync();
        string itemsText = "";
        foreach (var item in storageItems)
        {
            itemsText += item.Name + Environment.NewLine;
        }
        this.DefaultViewModel["Text"] = "StorageItems: " + Environment.NewLine + itemsText;
    }

    this.DefaultViewModel["Title"] = shareProperties.Title;
    this.DefaultViewModel["Description"] = shareProperties.Description;
    this.DefaultViewModel["Image"] = thumbnailImage;
    this.DefaultViewModel["Sharing"] = false;
    this.DefaultViewModel["ShowImage"] = false;
    Window.Current.Content = this;
    Window.Current.Activate();

    // Update the shared content's thumbnail image in the background
    if (shareProperties.Thumbnail != null)
    {
        var stream = await shareProperties.Thumbnail.OpenReadAsync();
        thumbnailImage.SetSource(stream);
        this.DefaultViewModel["ShowImage"] = true;
    }
}

 変更が終わったら1度実行して、共有ターゲットとして登録します。
 その後、共有ソースとなるアプリから共有コントラクトを使ってデータを受け渡します。

 データを受け取った時の画面は以下のようになります。

 uriを受け取った場合。


 bitmapを受け取った場合。


 ファイルを受け取った場合。