WPF와 WinForm의 Shown 이벤트 시점
지난번 글에 이어서.
WPF - UI 업데이트를 바로 반영하고 싶다면?
; https://www.sysnet.pe.kr/2/0/747
이번에도 Dispatcher에 대한 이해를 제대로 하고 있다면 풀 수 있는 문제입니다.
잘 아시는 것처럼, WinForm과 WPF는 각각 Form.Load / Window.Loaded 이벤트에서는 윈도우가 아직 화면에 보여지지 않은 상태입니다. 윈도우가 보여진 이후에 작업하고 싶은 경우 Form.Shown / Window.ContentRendered에서 처리하면 됩니다.
이에 관해서는 다음의 토픽에서 잘 정리해 놓고 있습니다.
Hello WPF World, part 3 - Forms and Windows
; http://stuff.seans.com/2008/07/16/hello-wpf-world-part-3-forms-and-windows/
어떤 분은 ^^ Form.Shown 이벤트 대신에 다음과 같이 Application.Idle 이벤트를 사용한 방법도 보여주는군요.
Windows Form의 Loaded 이벤트
; http://crynut84.tistory.com/42
그런데, Window.ContentRendered의 경우 이름에서 보이는 것처럼 반드시 Window.Content가 null이 아닌 상태에서만 발생합니다. 사실 현실적으로 그렇지 않은 경우가 있을 수 없겠지만, 이런 경우에도 통용될 수 있는 Shown 이벤트 시점을 잡아보는 것도 좋은 실습 대상으로 보입니다.
지난번 글을 이해하신 분들은 답을 내실 수 있겠지요? ^^
그렇습니다. 다음과 같은 식으로 코드를 만들면 됩니다.
// 생성자
public Window1()
{
InitializeComponent();
this.Dispatcher.BeginInvoke
(
DispatcherPriority.Input,
(ThreadStart)(() =>
{
Debug.WriteLine("폼이 보인 후.");
}
)
);
}
테스트해 본 바에 의하면, DispatcherPriority.Input 우선순위(5)가 먼저 처리되고, Window.ContentRendered가 처리됩니다. 여기서 DispatcherPriority.Background 우선순위(4)로 낮추면, Window.ContentRendered가 먼저 실행되고 그다음에 델리게이트가 실행됩니다.
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]