закрытие потока FileStream не дает вывести Image

FileStream ReadFile = File.OpenRead(Directory.GetCurrentDirectory() + @"\test.bmp");
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = ReadFile;
image.DecodePixelWidth = (int)Images.Width;
image.DecodePixelHeight = (int)Images.Height;
image.EndInit();
Images.Source = image;
ReadFile.Close(); // без этого все работает 

без этой строчки при повторном нажатии будет ошибка не завершеных потоков


Ответы (1 шт):

Автор решения: aepot

Вы как-то слишком усложнили код.
Конструктор BitmapImage всё это умеет делать сам.

string filePath = Path.Combine(Directory.GetCurrentDirectory(), "test.bmp");
Images.Source = new BitmapImage(new Uri(filePath));

Либо на основе вот этого примера, на случай если вам критично задать DecodePixelWidth и DecodePixelHeight.

string filePath = Path.Combine(Directory.GetCurrentDirectory(), "test.bmp");
BitmapImage image = new BitmapImage();
image.BeginInit();
image.DecodePixelWidth = (int)Images.Width;
image.DecodePixelHeight = (int)Images.Height;
image.UriSource = new Uri(filePath);
image.EndInit();
Images.Source = image;

Либо, если вам очень хочется использовать FileStream, то нужно учесть, что картинка грузится асинхронно и диспозить поток надо не раньше, чем по факту завершения ее загрузки.

string filePath = Path.Combine(Directory.GetCurrentDirectory(), "test.bmp");
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = File.OpenRead(filePath);
image.DecodePixelWidth = (int)Images.Width;
image.DecodePixelHeight = (int)Images.Height;
image.DownloadCompleted += (s, e) => (s as BitmapImage).StreamSource.Dispose();
image.EndInit();
Images.Source = image;

Или еще из комментариев @vitidev и вот этой страницы документации я узнал, что можно сообщить BitmapImage, чтобы картинка загрузилась сразу, и после EndInit() можно было бы закрыть поток.

Присвойте свойству CacheOption значение BitmapCacheOption.OnLoad, если хотите закрыть поток после создания BitmapImage.

string filePath = Path.Combine(Directory.GetCurrentDirectory(), "test.bmp");
BitmapImage image = new BitmapImage();
using (FileStream fileStream = File.OpenRead(filePath))
{
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = fileStream;
    image.DecodePixelWidth = (int)Images.Width;
    image.DecodePixelHeight = (int)Images.Height;
    image.EndInit();
}
Images.Source = image;

Но я не рекомендую этот метод, так как ваш код будет ожидать полной загрузки картинки синхронно, и пока эта загрузка не завершится, приложение будет "висеть".

→ Ссылка