我在ListBox上显示图像列表时遇到问题,当一些图像最初不存在时。
创建丢失的图像后,我尝试重新加载它们,但我仍然得到AG_E_NETWORK_ERROR。此外,我确定图像存在是因为我从闪存中加载它们,并且我正在通过D:\Work\SilverlightApplication2\SilverlightApplication2\Bin\Debug\SilverlightApplication2TestPage.html
加载我的Silverlight应用程序,所以没有其他奇怪的mambo-jumbo正在进行。
此设置适用于Silverlight 4,但不适用于Silverlight 5.
更多详情:
我使用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;如何将绑定重新加载到不存在的图像,现在
答案 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
的原因