に入れているアイテムOnDownloadProgress
の順序付きリスト用の単一のイベントハンドラーがあり、イベントハンドラーで送信ビットマップイメージのインデックスを取得するための最良の方法を考えています。BitmapImage
FlipView
から派生したオブジェクトを使用してこの種のことを行うのは簡単です。オブジェクトには、インデックス(または必要なもの)に設定できるプロパティが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つをスクラッチします。Tag
Index
sealed
この種のことを行うためのより簡単な、またはより標準化された方法はありますか?