закрытие потока 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 шт):
Вы как-то слишком усложнили код.
Конструктор 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;
Но я не рекомендую этот метод, так как ваш код будет ожидать полной загрузки картинки синхронно, и пока эта загрузка не завершится, приложение будет "висеть".