画像の読み込みで UI スレッドがブロックされるという問題が発生しているため、Windows ストア アプリでグリッドビューが応答しません。
私がやろうとしているのは、グリッドビューの画像がビューモデルの画像プロパティにバインドされるようにすることです。image プロパティの値は async メソッドによって設定されます。アプリが起動すると、すべてのオブジェクトが読み込まれますが、実際の画像データは読み込まれません。画像データは、UI 仮想化が開始され、xaml の画像コントロールにバインドされた画像プロパティを介して画像データを要求するときに読み込まれます。
これはすべて、観察可能なコレクションで行われます。
ここにいくつかのコードがあります:
private ImageSource _image = null;
private String _imagePath = null;
public ImageSource Image
{
get
{
SetImageFromStorageFile().ContinueWith(OnAsyncFail, TaskContinuationOptions.OnlyOnFaulted);
return this._image;
}
}
private async Task SetImageFromStorageFile()
{
this.IsLoading = true;
if (this._image == null && this._imagePath != null)
{
this._image = await BitmapLoader.GetPreviewImageFromStorageFile(this.StorageFile); //getting the actual data here
this.OnPropertyChanged("Image");
}
this.IsLoading = false;
}
これは、画像データにアクセスするときに UI が応答しなくなることを除いて、すべて正常に機能しています。
ご覧のとおり、プロパティから非同期メソッドを呼び出しています。他の場所から呼び出したコードを再利用しているだけです。他の場所から呼び出された場合、await を使用でき、UI はレスポンシブです。問題は、gridviews UI 仮想化を使用する場合、UI をブロックせずにこの非同期メソッドを実行する方法がわからないことです (私が知る限り) プロパティを非同期で実行することはできません。
したがって、グリッドビューでこのプロパティ(またはメソッド)を同期ではなく非同期で実行したいだけですが、その方法がわかりません。
助けてください :)