我有一个OnDownloadProgress
事件处理程序,用于我放入FlipView
的BitmapImage
项目的订购列表,我想知道获得获得索引的最佳方法在事件处理程序中发送位图。
使用FrameworkElement
派生的对象进行此类操作,因为它们具有Tag
属性,您可以将其设置为索引(或任何您想要的)。但是OnDownloadProgress事件不是由Image
发送的,而是由位映射发送,并且没有Tag
。
我可以想到几种实现这一目标的方法,但它们看起来很笨拙或沉重。
一种方法是将图像的Tag
设置为位映射实例,然后在处理程序中搜索该实例,直到找到发件人:
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++;
}
}
,但这似乎有些错误。一种更好的方法是将绘制绘制实例映射到索引(Dictionary<BitmapImage, int>
),虽然效率更高,但似乎也很重。
或者,最后,我可以子类BitmapImage
并添加Tag
或Index
成员。哦,等等...这是sealed
类。刮擦那个。
是否有一种更简单或更标准化的方法来做这种事情?
您可以做到这一点:
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);
}
}