0

我正在使用绑定到 UI 上的图像属性的视图模型,并且视图模型包含 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;
   }

出于某种奇怪的原因,在以下代码中,当我在 BitmapImage 上调用 Freeze 时,它​​不会出现在主窗口中。我没有遇到异常或崩溃。有人可以帮我吗?我正在异步设置图像属性,因此我需要能够使用创建的图像,假设 GetImageFromUri 调用是从 UI 线程以外的线程进行的。

4

3 回答 3

3

在冻结之前尝试为 BitmapImage 设置 CacheOption。看看这是否有效 -

var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = urisource;
image.EndInit();
image.Freeze();
于 2011-10-25T16:31:51.773 回答
1

在冻结它之前,您需要完全渲染它。
您应该尝试监听 SourceUpdated 事件,然后才冻结图像。

附带说明,如果您想在此之后修改图像,则必须克隆它。

于 2011-10-25T16:03:38.833 回答
0

如果我使用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;
        }
    }

BitmapSourceUriSource,但它在 xaml 呈现后工作

于 2019-02-07T09:34:47.523 回答