0

そのため、私はほぼ 1 日中、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 に答える