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



我有一个OnDownloadProgress事件处理程序,用于我放入FlipViewBitmapImage项目的订购列表,我想知道获得获得索引的最佳方法在事件处理程序中发送位图。

使用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并添加TagIndex成员。哦,等等...这是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);
    }
}

相关内容

最新更新