関連付けによるアプリ実行と共有
前回作成した画像ファイルをリスト表示するアプリに、関連付けされたアプリを実行する機能と共有チャームによるファイル共有機能を追加してみたいと思います。
関連付けされたアプリの実行
関連付けされたファイルの実行は、StorageFile を渡して Launcher.LaunchFileAsync() メソッドを呼び出すだけです。
項目をクリックした時に実行されるようにしてみます。
async void ItemView_ItemClick(object sender, ItemClickEventArgs e) { var item = (FileDataItem)e.ClickedItem; var file = await StorageFile.GetFileFromPathAsync(item.ImagePath); await Launcher.LaunchFileAsync(file); }
実行して、ファイルをクリックすると、標準の状態ではフォトアプリが起動してクリックしたファイルの画像が表示されます。
共有チャーム
共有チャームのソースとして、ターゲットアプリにファイルを渡せるようにします。
◇画面
GridView 上で項目を選択可能にするために、itemGridView の SelectionMode を Single に変更します。
◇データモデル
サムネイル取得時以外でもファイルのパスを使いたいので、_imagePath を返すプロパティを追加します。
private String _imagePath = null; public string ImagePath { get { return this._imagePath; } set { this.SetProperty(ref this._imagePath, value); } }
◇共有
共有チャームが実行された時に呼び出されるイベントハンドラを OnNavigatedTo の中で登録します。
var datatransferManager = DataTransferManager.GetForCurrentView(); datatransferManager.DataRequested += DatatransferManager_DataRequested;
共有チャームが実行されるとイベントハンドラが呼び出されますので、選択されているファイルを設定します。
ファイルが選択されていない場合は、表示されるメッセージを設定します。
async void DatatransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { var item = (FileDataItem)itemGridView.SelectedItem; if (item != null) { args.Request.Data.Properties.Title = item.Title; var items = new List<StorageFile>(); items.Add(await StorageFile.GetFileFromPathAsync(item.ImagePath)); args.Request.Data.SetStorageItems(items); } else { args.Request.FailWithDisplayText("ファイルを選択してください。"); } }
共有チャームを実行すると以下のような画面になります。
なお、スナップ表示時は共有チャームを実行しても呼び出されません(大きく表示されている方のアプリが呼び出される)。
◇GridView の問題点
アプリを実行してみるといくつか気になる動作があります。
まず、カーソルキーによる動作についてですが、GridView にフォーカスがない場合はカーソルキーの左右でスクロールが行えます。
GridView にフォーカスがある場合、カーソルキーの左右で選択項目が移動していくのですが、スクロールは行われないため選択項目が画面外になってしまい、どの項目が選択されているのかわからなくなってしまいます。
次に、選択状態についてですが、起動して項目が追加されていくと何もしていないのに最初から項目が選択されている状態になってしまいます。
この状態で他の項目を選択すると、SelectionMode を Single にしているのに2つの項目が選択された状態になります。
このあたりは、Consumer Preview ではまだ問題があるようです。
※追記1
カーソルキーで選択項目が移動する時にスクロールしないのは、スクロールを行っているのが GridView ではなくその親である ScrollViewer だからですね。
タッチパネルがない状態ではキーボードを使ってスクロールしたくなるので、選択項目移動に合わせてスクロールするように自分で実装する必要があるようです。
※追記2
GridView の問題点について、追加で調査を行いました。
GridView の仮想化 - rebuild