1

に入れているアイテムOnDownloadProgressの順序付きリスト用の単一のイベントハンドラーがあり、イベントハンドラーで送信ビットマップイメージのインデックスを取得するための最良の方法を考えています。BitmapImageFlipView

から派生したオブジェクトを使用してこの種のことを行うのは簡単です。オブジェクトには、インデックス(または必要なもの)に設定できるプロパティがFrameworkElementあるためです。Tagただし、OnDownloadProgressイベントは、ImageではなくBitmapImageによって送信され、。はありませんTag

これを達成するためのいくつかの方法を考えることができますが、それらはハックまたは重いようです。

1つの方法は、画像TagをBitmapImageインスタンスに設定し、送信者が見つかるまでハンドラーでそのインスタンスを検索することです。

private FlipView PhotosView;

private void AddImages(List<string> photoUrls)
{
    PhotosView.Items.Clear();
    foreach (var url in photoUrls)
    {
        var image = new Image();
        var source = new BitmapImage(new Uri(url));
        source.DownloadProgress += OnDownloadProgress;
        image.Source = source;
        image.Tag = source;
        PhotosView.Items.Add(image);
    }
}

private void OnDownloadProgress(object sender, DownloadProgressEventArgs args)
{
    int n = 0;
    foreach (var item in PhotosView.Items)
    {
        var image = (Image)item;
        if (image.Tag == sender)
        {
            Debug.WriteLine("image {0} progress={1}%", n, args.Progress);
            break;
        }
        n++;
    }
}

しかし、それはちょっと間違っているようです。より良い方法は、BitmapImageインスタンスのインデックス(Dictionary<BitmapImage, int>)へのマッピングを維持することです。速度効率は高くなりますが、それもやや重いようです。

または、最後に、またはメンバーをサブクラス化BitmapImageして追加することもできます。ちょっと待って...それはクラスです。その1つをスクラッチします。TagIndexsealed

この種のことを行うためのより簡単な、またはより標準化された方法はありますか?

4

1 に答える 1

2

あなたはこれを行うことができます:

private void AddImages(List<string> photoUrls)
{
    PhotosView.Items.Clear();
    int nextIndex = 0;
    foreach (var url in photoUrls)
    {
        int n = nextIndex++;
        var image = new Image();
        var source = new BitmapImage(new Uri(url));
        source.DownloadProgress += (sender, args) => 
        {
            Debug.WriteLine("image {0} progress={1}%", n, args.Progress);
        };
        image.Source = source;
        image.Tag = source;
        PhotosView.Items.Add(image);
    }
}
于 2012-11-08T04:20:06.923 に答える