Canvasオブジェクト(名前:canvas)を含むWPFウィンドウがあります。
ユーザーがボタンをクリックすると、大量のデータが読み込まれ、時間がかかります。
そのため、UIをフリーズして、バックグラウンドスレッドを作成したくありません。
Thread thread = new Thread(new ThreadStart(BuildGraph));
thread.SetApartmentState(ApartmentState.STA);\
thread.IsBackground = true;
thread.Start();
このBuildGraph関数内で、データをロードし、いくつかの図形を作成して、これらの図形をキャンバスに配置します。これらの形状を作成するには、スレッドがSTAである必要があります。
ディスパッチャーを使用してtextBox、progressbarを更新します。それらはすべて大丈夫です。
String txt = (String)Dispatcher.Invoke(DispatcherPriority.Send, (DispatcherOperationCallback)delegate { return labelStatus.Content; }, null);
ラベルの内容を正しく取得できます。
しかし、問題は、UIElementCollectionであるキャンバスChildrenを取得できないことです。
したがって、この操作は成功しません。canvasChildren =(UIElementCollection)Dispatcher.Invoke(DispatcherPriority.Send、new getChildrenDelegate(obtainChildren));
そしてこれも失敗します
Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => canvas.Children.Add(node)));
ここで何が問題になっていますか?ラベルコントロールを取得できるのに、キャンバスコントロールを取得できないのはなぜですか?
奇妙なことに、Dispatcherの助けがなくてもcanvas.ActualHeightを直接使用できます。