0

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

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

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

这是完整的示例代码

更多细节:

我用 ListBox 创建了一个 Silverlight 应用程序。ListBox 绑定到列表中ObservableCollectionThumbnailItem每个项目,具有一个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; 博士;如何重新加载绑定到不存在但现在确实存在的图像

4

2 回答 2

1

Image AG_E_NETWORK_ERROR

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

于 2012-09-11T13:14:44.870 回答
1

这段代码的结构有点奇怪。为什么您将更改通知设置在 ThumnailItem 类之外?通常的方法是跳过使用自动属性并在公共字符串 ThumbnailPath 中拆分设置器,以便它调用更改通知本身。这也将有助于您的 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 驱动器加载的。您正在跨方案访问文件(http 托管,但文件是本地文件),并且您正在访问沙箱外的文件。

要从 F 驱动器加载,您需要是一个在浏览器外运行的受信任应用程序。您的项目是面向 Silverlight 4 运行时的浏览器内不受信任的应用程序。我不希望这可以在具有 SL4 或 SL5 运行时的 Silverlight 4 中工作。这段代码不可能像写的那样工作。

希望有帮助。

皮特

[注意:这一切都是在没有意识到他正在从 file:// 加载 Silverlight 应用程序的情况下编写的——这不是一种常见的方法]

于 2012-06-01T20:34:03.050 回答