我有一个OnDownloadProgress
个事件处理程序,用于BitmapImage
项目的有序列表,我将其放入FlipView
,我想知道最好的获取方式事件处理程序中发送BitmapImage的索引。
使用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
或Index
成员。哦等等......这是一个sealed
课程。抓一个。
有没有更简单或更标准化的方法来做这种事情?
答案 0 :(得分: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);
}
}