升级到silverlight 5后,图像AG_E_NETWORK_ERROR

时间:2012-06-01 20:11:12

标签: c# silverlight silverlight-4.0 silverlight-5.0

我在ListBox上显示图像列表时遇到问题,当一些图像最初不存在时。

创建丢失的图像后,我尝试重新加载它们,但我仍然得到AG_E_NETWORK_ERROR。此外,我确定图像存在是因为我从闪存中加载它们,并且我正在通过D:\Work\SilverlightApplication2\SilverlightApplication2\Bin\Debug\SilverlightApplication2TestPage.html加载我的Silverlight应用程序,所以没有其他奇怪的mambo-jumbo正在进行。

此设置适用于Silverlight 4,但不适用于Silverlight 5.

Here's the full sample code

更多详情:

我使用ListBox创建了一个Silverlight应用程序。 ListBox绑定到ObservableCollection ThumbnailItem列表中的每个项目都有ThumbnailPath属性,该属性是图像路径的字符串。

ThumbnailPath处的文件最初可能不存在,但是当我确定它存在时,我会调用PropertyChanged事件来通知绑定了ThumbnailPath的任何人。

测试此功能的一种简单方法是在不插入闪存驱动器的情况下加载Silverlight应用程序。图像加载失败后,插入闪存驱动器并点击刷新按钮。

public class ThumbnailItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string ThumbnailPath { get; set; }
    public void NotifyThumbnailPathChanged() { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ThumbnailPath")); }
}

public partial class MainPage : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<ThumbnailItem> lImages { get; set; }

    public MainPage() { ... }

    private void userControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        //loading the list items            

        lImages.Add(new ThumbnailItem { ThumbnailPath = "F:/onlinePhotos2/262594030.jpg" });
        lImages.Add(new ThumbnailItem { ThumbnailPath = "F:/onlinePhotos2/1276943735.jpg" });
        lImages.Add(new ThumbnailItem { ThumbnailPath = "F:/onlinePhotos2/1632696970.jpg" });
        lImages.Add(new ThumbnailItem { ThumbnailPath = "F:/onlinePhotos2/1656387141.jpg.original.jpg" });
        lImages.Add(new ThumbnailItem { ThumbnailPath = "F:/onlinePhotos2/1699209377.jpg" });
    }

    private void ButtonRefresh_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        //refreshing the list after the images exist 

        foreach (ThumbnailItem tsi in lImages)
        {
            string temp = tsi.ThumbnailPath;
            tsi.ThumbnailPath = null;
            tsi.NotifyThumbnailPathChanged();

            tsi.ThumbnailPath = temp;
            tsi.NotifyThumbnailPathChanged();
        }
    }
}

TL; DR;如何将绑定重新加载到不存在的图像,现在

2 个答案:

答案 0 :(得分:1)

这段代码的结构有点奇怪。为什么要在ThumnailItem类外部进行更改通知?通常的方法是跳过使用auto属性并在公共字符串ThumbnailPath中分解setter,以便它自己调用更改通知。这也将有助于您的Loaded事件,其中更改通知永远不会被触发,尽管此时控件已经绑定到集合。

像这样:

public class ThumbnailItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _thumbnailPath;
    public string ThumbnailPath 
    {
        get { return _thumbnailPath; }
        set
        {
            if (value == null || _thumbnailPath != value)
            {
                _thumbnailPath = value;

                NotifyPropertyChanged("ThumbnailPath");
            }
        }
    }
    protected void NotifyPropertyChanged(string propertyName) 
    { 
        if (PropertyChanged != null) 
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    }
}

是否显示任何图片?我不这么认为,因为你是从网页上的插件中的F盘加载的。您正在访问文件cross-sceheme(http托管,但文件是本地的),并且您正在访问沙箱外的文件。

要从F驱动器加载,您需要成为在浏览器外运行的可信应用。您的项目是一个针对Silverlight 4运行时的浏览器内不受信任的应用。我不希望这在SL4或SL5运行时的Silverlight 4中运行。这段代码无法按照书面形式运作。

希望有所帮助。

皮特

[注意:所有这些都没有意识到他正在从文件中加载Silverlight应用程序:// - 不是常用方法]

答案 1 :(得分:1)

Image AG_E_NETWORK_ERROR

图像参考路径错误(或)未放置在client-bin文件夹中的图像。 这些是Silverlight中Image AG_E_NETWORK_ERROR的原因