WPF заморожен BitmapImage не отображается - PullRequest
0 голосов
/ 25 октября 2011

Я использую модель представления, связанную со свойством изображения в пользовательском интерфейсе, а модель представления содержит свойство ImageSource. Я установил это свойство с помощью следующей функции

    private BitmapImage GetImageFromUri(Uri urisource)
    {
        if (urisource == null)
            return null;

        var image = new BitmapImage();
        image.BeginInit();
        image.UriSource = urisource;
        image.EndInit();
        image.Freeze(); //commenting this shows the image if the routine is called from the proper thread.

        return image;
   }

По какой-то странной причине в следующем коде, когда я вызываю Freeze для моего BitmapImage, он не появляется в главном окне. Я не получаю никаких исключений или сбоев. Кто-нибудь может мне помочь с этим? Я устанавливаю свойство изображения асинхронно, поэтому мне нужно иметь возможность использовать созданное изображение, предполагая, что вызов GetImageFromUri был сделан из потока, отличного от потока пользовательского интерфейса.

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

Попробуйте установить CacheOption для BitmapImage, прежде чем заморозить его.Посмотрите, работает ли это -

var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = urisource;
image.EndInit();
image.Freeze();
0 голосов
/ 07 февраля 2019

ЕСЛИ я использую StreamSource, для меня достаточно:

public static BitmapSource ToBitmap(this MemoryStream stream)
    {
        try
        {
            using (stream)
            {
                stream.Position = 0;
                var image = new BitmapImage();
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.StreamSource = stream;
                image.EndInit();
                image.Freeze();
                return image;
            }
        }
        catch (Exception)
        {
            return null;
        }
    }

Но если я использую UriSource, мне нужно:

public static async Task<BitmapSource> ToBitmapAsync(this string sourceUri)
    {
        try
        {
            using (var client = new WebClient())
            using (var stream = await client.OpenReadTaskAsync(new Uri(sourceUri)))
            using (var ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                return ms.ToBitmap();
            }
        }
        catch (Exception)
        {
            return null;
        }
    }

BitmapSource имеет UriSource, но работает после рендеринга xaml

0 голосов
/ 25 октября 2011

Перед тем, как заморозить его, вам нужно полностью отрендерить его.
Вы должны попытаться прослушать событие SourceUpdated и только затем заморозить изображение.

На заметку, если вы когда-либо захотитечтобы изменить изображение после этого, вам придется его клонировать.

...