0

因此,我几乎整个工作日都在努力将 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));
        }
    }
}

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

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

问题是当我运行它时,我得到这个错误:“调用线程无法访问这个对象,因为另一个线程拥有它”。现在我通过查看这个 StackOverflow 线程知道我必须做什么:调用线程无法访问这个对象,因为不同的线程拥有它。如何编辑图像?,但我就是跟不上。有人可以告诉我如何使用这个 Dispatcher.Invoke 吗?

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

4

1 回答 1

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。然后最后我调用了这个动作。

于 2012-05-04T13:22:25.640 回答