2012-07-13 2 views
1

캔버스 개체 (이름 : 캔버스)가 포함 된 WPF 창이 있습니다.캔버스 추가 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 obtainChildrenDelegate (obtainChildren)));

그리고 이것은 잘못된 여기에 무엇 너무

Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => canvas.Children.Add(node))); 

실패? 캔바스 컨트롤이 아닌 라벨 컨트롤을 얻을 수있는 이유는 무엇입니까?

이상한 점은 Dispatcher의 도움없이 canvas.ActualHeight를 직접 사용할 수 있다는 것입니다.

답변

1

다른 스레드에서 UIElement를 수정할 수 없습니다.

또한 스레드 A에 UIElement에를 생성 할 수 있으며,

당신은 요소를 생성하고 부모와 같은 스레드에 할당해야합니다 스레드 B.에 부모에 할당합니다.

배경 스레드에서 브러시를 만들고 호출 스레드의 개체에 브러시를 할당했을 때 같은 문제가 발생했습니다.