我有一个单独的事件处理程序,用于我放入 aOnDownloadProgress
的有序项目列表,我想知道在事件处理程序中获取发送 BitmapImage 的索引的最佳方法。BitmapImage
FlipView
使用从 派生的对象很容易做这种事情FrameworkElement
,因为它们有一个Tag
属性,您可以将其设置为索引(或任何您想要的)。但是 OnDownloadProgress 事件不是由 发送的Image
,而是由 BitmapImage 发送的,并且没有Tag
.
我可以想出几种方法来实现这一点,但它们看起来很笨拙或沉重。
一种方法是将 Image 设置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
并添加一个Tag
orIndex
成员。哦等等……这是一sealed
堂课。刮那个。
有没有更简单或更标准化的方法来做这种事情?