WPFアプリのImageにファイルを掴ませないようにする

2020/01/21

C# WPF

アイキャッチ

以前紹介した記事では表示していた(している)ファイルをアプリケーションが掴んでいるのでファイルの削除ができません。

表示されてなければそのうち離してくれるかもしれませんが、悠長に待っている訳にはいきません。

じゃあどうするかと言えばWriteableBitmapに変換して変換したデータを表示するようにすればファイルは掴みません。

また、Viewは変更不要です。

ViewModelでBindingするのは

public ReactivePropertySlim ViewImage { get; } = new ReactivePropertySlim();

stringがWriteableBitmapに変わってます。

そして実際に画像を表示するには

// 対象がリソース
System.Windows.Resources.StreamResourceInfo sr = Application.GetResourceStream(new Uri(@"\Image_DragAndDrop;component\Resource\blank.jpg", UriKind.Relative));
BitmapFrame bf = BitmapFrame.Create(sr.Stream);
ViewImage.Value = new WriteableBitmap(bf);

// 対象がファイル
MemoryStream data = new MemoryStream(File.ReadAllBytes("フルパスのファイル名"));
ViewImage.Value = new WriteableBitmap(BitmapFrame.Create(data));
data.Close();

対象が内部リソースなら気にする事はありませんが、外部ファイルの場合MemoryStreamのCloseメソッドを実行する事で取得した画像ファイルを手放します。

2020/2/28追記

もう少しスマートに書く例を掲載します。

これを

// 対象がファイル
MemoryStream data = new MemoryStream(File.ReadAllBytes("フルパスのファイル名"));
ViewImage.Value = new WriteableBitmap(BitmapFrame.Create(data));
data.Close();

こうできます。

// 対象がファイル
using MemoryStream data = new MemoryStream(File.ReadAllBytes("フルパスのファイル名"));
ViewImage.Value = new WriteableBitmap(BitmapFrame.Create(data));

常日頃忘れないようにしたいusingですね。

自己紹介

自分の写真



新潟県のとある企業で働いてます。
【できる事】
電子回路設計
基板パターン設計
マイコンプログラム
C#(WinForms WPF)を使ったWindowsアプリケーション作成
PLCラダー
自動化装置アドバイザー
にほんブログ村 IT技術ブログ ソフトウェアへ

カテゴリ

このブログを検索

QooQ