所以,我一直在努力将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显示在列表中。
答案 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的操作。然后在最后我调用了这个动作。