如何从"多路复用"获取发件人项目的索引事件处理程序

时间:2012-11-08 04:11:38

标签: c# event-handling windows-8

我有一个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并添加TagIndex成员。哦等等......这是一个sealed课程。抓一个。

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

1 个答案:

答案 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);
    }
}