How do I fix this error - "System.ObjectDisposedException: 'Cannot access a closed Stream.'"

580 Views Asked by At

The error is that the memory stream is not accessible when it is closed. It occurs when I try to set the previous image of the image control back to a Gif. When the previous image was a gif, I convert it to a bitmap with a memory stream. When the previous image was a normal png or jpg, it can display successfully.

I have tried to research how to fix the error. A solution I've tried is to convert the images to byte[] but then the gif isn't animating like they have been converted to a static image.

To display the gif I use a NuGet package called WPFAnimatedGif and to make the Wpf look better I use the NuGet package Materialdesigntheme

This is the event code that fires upon drag leave

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

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

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

How I convert it

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();
            }

For full code visit these Pastebins:

Edit

Updated conversion function based upon responses

        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;
        }
0

There are 0 best solutions below