0

一部の画像が最初に存在しない場合、ListBox に画像のリストを表示する際に問題が発生します。

不足している画像が作成された後、それらを再読み込みしようとしましたが、それでも AG_E_NETWORK_ERROR が発生します。また、持っているフラッシュ メモリから画像を読み込んでいるので、画像が存在していると確信していますD:\Work\SilverlightApplication2\SilverlightApplication2\Bin\Debug\SilverlightApplication2TestPage.html

この設定は Silverlight 4 では機能しますが、Silverlight 5 では機能しません。

ここに完全なサンプルコードがあります

詳細:

ListBox を使用して Silverlight アプリケーションを作成しました。ObservableCollectionListBox は、リストの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; 存在しなかったが現在存在するイメージへのバインディングをリロードする方法

4

2 に答える 2

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)); 
    }
}

画像のいずれかが表示されますか? WebページのプラグインでFドライブからロードしているため、そうは思いません。ファイルにクロススキーマ (http でホストされていますが、ファイルはローカル) にアクセスしており、サンドボックスの外部にあるファイルにアクセスしています。

F ドライブから読み込むには、ブラウザー外で実行される信頼できるアプリである必要があります。あなたのプロジェクトは、Silverlight 4 ランタイムを対象とするブラウザー内の信頼されていないアプリです。SL4 または SL5 ランタイムを使用する Silverlight 4 でこれが機能するとは思いません。このコードが書かれたとおりに機能することは決してありません。

それが役立つことを願っています。

ピート

[注: これはすべて、彼が file:// から Silverlight アプリを読み込んでいたことを認識せずに書かれたものです - 一般的な方法ではありません]

于 2012-06-01T20:34:03.050 に答える
1

Image AG_E_NETWORK_ERROR

画像参照パスが間違っています (または) 画像が client-bin フォルダー内に配置されていません。Image AG_E_NETWORK_ERRORこれらがSilverlightの理由です

于 2012-09-11T13:14:44.870 に答える