1

我有一个单独的事件处理程序,用于我放入 aOnDownloadProgress的有序项目列表,我想知道在事件处理程序中获取发送 BitmapImage 的索引的最佳方法。BitmapImageFlipView

使用从 派生的对象很容易做这种事情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并添加一个TagorIndex成员。哦等等……这是一sealed堂课。刮那个。

有没有更简单或更标准化的方法来做这种事情?

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 回答