将BitmapImages添加到ListBox时出错

时间:2012-05-03 19:55:42

标签: xaml listbox bind bitmapimage

所以,我一直在努力将BitmapImages添加到ListBox中,这几乎是整个工作日。这是我的代码:

public class SomeClassViewModel : ViewModelBase
{
    public SomeClassViewModel(EnhanceImage image)
    {
       LoadImages();
    }

    public List<BitmapImage> ListOfImages { get; set; }

    public void LoadImages()
    {
        ListOfImages = new List<BitmapImage>();
        DirectoryInfo imageDir = new DirectoryInfo(@"..\..\Images");
        foreach (FileInfo imageFile in imageDir.GetFiles("*.jpg"))
        {
            Uri uri = new Uri(imageFile.FullName);
            ListOfImages.Add(new BitmapImage(uri));
        }
    }
}

正如您所看到的,我将文件扩展名为“.jpg”的文件夹“Images”中的所有图像添加到名为ListOfImages的BitmapImages列表中。然后我将它绑定到XAML中的ListBox,如下所示:

<ListBox ItemsSource="{Binding ListOfImages}"/>

问题是,当我运行它时,我收到此错误:“调用线程无法访问此对象,因为另一个线程拥有它”。现在我知道通过查看这个StackOverflow线程我需要做些什么:The calling thread cannot access this object because a different thread owns it.How do i edit the image?,但我无法遵循它。有人可以告诉我如何使用这个Dispatcher.Invoke吗?

编辑:现在我只是想让图片的URI显示在列表中。

1 个答案:

答案 0 :(得分:0)

我想通了,以为我会发布我的答案。

这是我在foreach循环中所做的:

Uri uri = new Uri(imageFile.Fullname);
BitmapImage tmpImage = new BitmapImage(uri)
tmpImage.Freeze();
Action action = delegate { ListOfImages.Add(tmpImage); };
Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
dispatcher.Invoke(action);

您可以看到我所做的是冻结BitmapImage,然后委托将BitmapImage添加到ListOfImages的操作。然后在最后我调用了这个动作。