1

我为此案例创建了一个测试项目。我的 .xaml 中有一个 Image 控件,如下所示:

<Image x:Name="img" />

我已经用 6 张图片测试了这个项目,所有这些图片都来自同一个网站。显示的图像大小约为 50 - 90 KB。未显示的图像为 294 KB。

我正在设置这样的图像来源:

img.Source = new BitmapImage(new Uri(imageURI));

可能是什么问题?谢谢。

更新1:

另外,我已经检查了 ImageFailed 事件。它正在抛出AG_E_NETWORK_ERROR异常。

更新2:

这是未显示的图像来源:(已删除)

4

2 回答 2

3

感谢@Claus Jørgensen,我了解到一些网站可以使用热链接保护来防止其他网站直接链接到您网站上的文件和图片。所以我创建了一个 AttachedProperty 用于将 Image 的源绑定到 URI 并异步下载它。

这是.xaml:

<Image AttachedProperties:ImageProperties.SourceWithCustomReferer="{Binding Image, Mode=TwoWay}"/>

和附加属性:

public static class ImageProperties
{
    #region SourceWithCustomReferer Property
    public static Dictionary<Uri, BitmapImage> imageCache = new Dictionary<Uri, BitmapImage>();

    public static readonly DependencyProperty SourceWithCustomRefererProperty =
        DependencyProperty.RegisterAttached(
            "SourceWithCustomReferer",
            typeof(Uri),
            typeof(ImageProperties),
            new PropertyMetadata(OnSourceWithCustomRefererChanged));

    private static void OnSourceWithCustomRefererChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var image = (Image)o;
        var uri = (Uri)e.NewValue;

        if (DesignerProperties.IsInDesignTool)
        {
            // for the design surface we just load the image straight up
            image.Source = new BitmapImage(uri);
        }
        else
        {
            if (imageCache.ContainsKey(uri))
            {
                image.Source = imageCache[uri];
                return;
            }

            image.Source = null;

            HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
            request.Headers["Referer"] = "http://www.WEBSITE.com"; // or your custom referer string here
            request.BeginGetResponse((result) =>
            {
                try
                {
                    Stream imageStream = request.EndGetResponse(result).GetResponseStream();
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        BitmapImage bitmapImage = new BitmapImage();
                        bitmapImage.CreateOptions = BitmapCreateOptions.BackgroundCreation;
                        bitmapImage.SetSource(imageStream);
                        image.Source = bitmapImage;
                        imageCache.Add(uri, bitmapImage);
                    });
                }
                catch (WebException)
                {
                    // add error handling
                }
            } , null);
        }
    }

    public static Uri GetSourceWithCustomReferer(Image image)
    {
        if (image == null)
        {
            throw new ArgumentNullException("Image");
        }
        return (Uri)image.GetValue(SourceWithCustomRefererProperty);
    }

    public static void SetSourceWithCustomReferer(Image image, Uri value)
    {
        if (image == null)
        {
            throw new ArgumentNullException("Image");
        }
        image.SetValue(SourceWithCustomRefererProperty, value);
    }
    #endregion
}
于 2013-07-14T08:50:16.773 回答
3

有问题的图像具有热链接保护。

这很可能是阻止您下载它的罪魁祸首。鉴于热链接保护,我猜您也没有在应用程序中使用它的必要权限。

如果您希望解决此问题,请使用HttpWebRequest类并设置HttpWebRequest.Referer属性。

于 2013-07-13T20:18:18.130 回答