2011-02-01 3 views
6

Dispatcher.PushFrame을 사용하여 코드를 차단하고 장기 실행 프로세스가 완료 될 때까지 UI를 새로 고칠 수 있습니다. Dispatcher.PushFrame에 대한 호출이 버튼 클릭 이벤트에서 발생한 경우 예상대로 작동합니다. 그러나 페이지의 Loaded 이벤트 또는 생성자에서이 동일한 코드를 사용하면 UI가 새로 고침되지 않으므로 페인트되지 않습니다. 임의의 실험으로, 생성자에서 Window.ShowDialog를 사용하여 시도해 보았습니다. 모달 대화 상자가 닫힐 때까지 컨트롤이 차단 된 경우에도 UI에서 페인트 할 수 있습니다. Dispatcher.PushFrame 또는 다른 수동 메커니즘을 사용하여 페이지로드 이벤트에서이 기능을 허용하는 솔루션을 제공 할 수 있습니까?Dispatcher.PushFrame 스타일 프로세스가 WPF 페이지에서 블로킹 할 때 도움이 필요합니다.

부록을 사용하여 내 창을 최소화하거나 최대화하면 UI 페인트가 정상적으로 처리되지만 크기를 수동으로 수행 할 때까지는 그렇지 않습니다.

+0

누군가가 신경 쓰면이 질문에 대한 배경 정보가 [msdn 포럼] (http://social.msdn.microsoft.com/Forums/en/wpf/thread/e2c85fa9-09c2-4eb1-bdd7)에 나와 있습니다. -78d8f2d6aaf3). (심지어 거기에 답변으로 표시된 ...) –

+0

@ user598946, 귀하의 질문은 정말 MSDN 포럼에서 대답했다. 그 대답에 당신이 분명하지 않다는 것이 있습니까? –

답변

3

MSDN의 Object Lifetime Events에서 내 반사되어서 Reflector 주변을 뒤덮어 보면 LoadedUnloaded 이벤트가 다른 이벤트와 같은 방식으로 발생하지 않는 것처럼 보입니다. 내부적으로는 BroadcastEventHelper 클래스가 사용되며, 시각적 트리의 모든 요소 사이에서 다양한 Loaded 이벤트를 조정하여 결국 DispatcherPriority.Loaded 수준으로 올립니다.

나는 이것이 당신이이 행동을 보는 이유라고 생각한다.

구체적 해결책은 Page.Loaded 이벤트 핸들러에 배치하지 말고 오히려 BackgroundWorker 또는 Task을 발행하여 작업을 완료하는 것이 좋습니다.

관련 문제