Как исправить эту ошибку - «System.ObjectDisposedException:« Невозможно получить доступ к закрытому потоку. » - PullRequest
0 голосов
/ 03 октября 2019

Ошибка в том, что поток памяти недоступен, когда он закрыт. Это происходит, когда я пытаюсь установить предыдущее изображение элемента управления изображением обратно в Gif. Когда предыдущее изображение было GIF, я преобразовал его в растровое изображение с потоком памяти. Когда предыдущее изображение было обычным png или jpg, оно может отображаться успешно.

Я попытался выяснить, как исправить ошибку. Решение, которое я пробовал, состоит в том, чтобы преобразовать изображения в byte [], но тогда gif не анимируется, как будто они были преобразованы в статическое изображение.

Для отображения gif я использую пакет NuGet под названием WPFAnimatedGifи для того, чтобы Wpf выглядел лучше, я использую пакет NuGet Materialdesigntheme

Это код события, который срабатывает при перетаскивании отпускать

if (previousIcon != null)
            {
                ToggleButton buttonControl = (ToggleButton)sender;

                Image imageControl = (Image)((Grid)buttonControl.Content).Children[1];

                if (previousIcon.ContainsKey(buttonControl))
                    ImageBehavior.SetAnimatedSource(imageControl, previousIcon[buttonControl]);
            }

Как я конвертирую его

BitmapImage bmImage = new BitmapImage();
            using (MemoryStream stream = new MemoryStream())
            {
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(wbm));
                encoder.Save(stream);
                bmImage.BeginInit();
                bmImage.CacheOption = BitmapCacheOption.OnLoad;
                bmImage.StreamSource = stream;
                bmImage.EndInit();
                bmImage.Freeze();
            }

Для получения полного кода посетите эти Pastebins:

Редактировать

Обновлена ​​функция преобразования на основе ответов

        public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm)
        {
            BitmapImage bmImage = new BitmapImage();
            MemoryStream stream = new MemoryStream();

            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(wbm));
            encoder.Save(stream);
            //stream.Position = 0;
            bmImage.BeginInit();
            bmImage.CacheOption = BitmapCacheOption.OnLoad;
            bmImage.StreamSource = stream;
            bmImage.EndInit();
            bmImage.Freeze();


            return bmImage;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...