wpf でのマルチスレッドに関するいくつかのトピックを既に見つけており、ほとんどのことをディスパッチで動作させることができましたが、まだ理解していないことが 1 つあります。「stackpanel1」と呼ばれるスタックパネルがあり、これに「stackrow」と呼ばれるスタックパネルを(別のスレッドで)子として追加します。(foreach ループ)
stackPanel1.Dispatcher.Invoke(new Action(() => stackPanel1.Children.Add(stackrow)));
この質問に似ています: WPF C# - Editing a listbox from another thread
ただし、「新しい項目」は UI 要素 (stackrow) であり、次のエラーが発生します: InvalidOperationException was unhandled. 別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。
この行で「stackrow」をディスパッチするにはどうすればよいですか?
編集: foreachloop で stackrow が作成されます
mainthread (新しいスレッドを作成) Thread t = new Thread(()=> addstackrows()); t.SetApartmentState(ApartmentState.STA); t.Start();
メソッド addstackrows()
private void addstackrows()
{
Dispatcher stackpaneldispatcher = stackPanel1.Dispatcher;
stackPanel1.Dispatcher.Invoke(new Action(() =>
stackPanel1.Children.Clear()));
stackPanel1.Dispatcher.Invoke(new Action(() =>
stackPanel1.Orientation = Orientation.Vertical));
foreach (var randomelement in elementcollection)
{
StackPanel stackrow = new StackPanel();
Dispatcher stackrowdp = stackrow.Dispatcher;
stackrow.Dispatcher.Invoke(new Action(() =>
stackrow.Orientation = Orientation.Horizontal));
stackPanel1.Dispatcher.Invoke(new Action(() =>
stackPanel1.Children.Add(stackrow)));
}
}