6

DataTemplate の一部として GridView で使用される画像 (PNG) ファイルがあります。GridView で特定のオブジェクト行を削除しようとすると、その行に関連する画像ファイルも削除されます。リストの項目ごとに画像が異なります。

このコードを使用して画像ファイルを削除しています

StorageFile _file = await DataStore.GetFileAsync(filename);
await _file.DeleteAsync(StorageDeleteOption.Default);

画像ファイルは、GridView の DataTemplate の下の GridView にレンダリングされます。したがって、リスト内の各オブジェクト モデルには、DataTemplate の ImageSource を返すパブリック プロパティがあります。

リストからオブジェクト行を削除した直後と、新しいリスト項目の GridView が更新された後に、削除手順を呼び出しています。

リストにオブジェクトが含まれていない (画像を消費している) 場合でも、ファイルを削除しようとすると、アプリは Access is Denied 例外をスローします。アプリの実行中に、その特定のファイルを手動で (ファイル エクスプローラーを使用して) 削除しようとしても、削除できません。

画像を削除する前に、GridView の ItemSource を null に、List を null に設定しても、アプリ内の未使用のオブジェクトをすべてクリアしようとしました。それでも例外は持続します。

前もって感謝します。

4

5 に答える 5

2

試すことができる 1 つの方法は、イメージをメモリ ストリームにロードし、BitmapImageそのストリームからオブジェクトを作成することです。その後、コントロールのソースImageをそのビットマップ イメージに設定できます。

実際の画像ファイルを画像のソースとして使用していないため、いつでも簡単に削除できます:)

于 2013-01-16T05:57:48.387 に答える
1

これは古い質問ですが、最近 UWP アプリで問題に遭遇し、実際に解決策を見つけることができました。ただし、最初に問題に関する背景情報をいくつか示します。

URI を使用して BitmapImage を作成すると、作成された URI オブジェクトはファイルへの参照をローカル ストレージに保持し、開いたままにします (つまり、書き込み不可)。これは、ビットマップが画像全体に収まる大きさである場合にのみ当てはまります。通常、小または中サイズのビットマップです。Bitmap がたまたま十分に大きい場合、WinRT は Image に表示されるときにダウンサンプリングされたバージョンを自動的に使用します。この場合、URI は元のファイルへの参照を保持しません。

次に、実際のソリューションに進みます。

Image.Source を null に設定しても、URI がまだ生きているため (少なくとも次の GC サイクルまで)、ここでは効果がありません。私にとってDIDが機能したのは、ソースを元のBitmapImageにキャストし、UriSourceをnullに設定することでした。

var bitmapImage = image.Source as BitmapImage;
if (bitmapImage != null)
  bitmapImage.UriSource = null;

そして、はい、これはばかげています。

于 2016-02-01T18:23:45.907 に答える
0

回避策として、アプリの起動中に未使用の画像を削除して、プロセスが使用しないようにしました。ありがとう。

于 2013-01-16T05:45:18.887 に答える
0

秘訣は、(文字列ファイル名の代わりに) Uri オブジェクトを使用して画像を読み込み、次にまったく同じ Uri インスタンスを使用してファイルを削除することです (もちろん、UI から画像を削除した後)。次に例を示します。

//Save the Uri as a member variable so you can get to it later
private Uri uri;

//Create the Uri
uri = new Uri(OriginalImageFilename, UriKind.Absolute);

//Load the image
BitmapImage bitmapImage = new BitmapImage(uri);
//This can also be done by binding a Image control's source property to the uri.

//Delete the image (remember to use the same Uri instance)
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(uri);
await file.DeleteAsync();
于 2012-12-30T19:50:26.747 に答える