c#/WPF

[WPF / xaml] WPF UI 랜더링 완료 시점

루다대디 2024. 12. 10. 10:08

개발을 하다보면 UI가 완전히 랜더링 된 시점을 정확히 잡아야 할 때가 있다

처음 프로그램을 실행 시킨후 MainWindow가 로드될때 이벤트 순서는 아래와 같다

1. 생성자 호출
 - 객체가 생성되는 단계로, 여기에서는 UI가 아직 로드되지 않은 상태다.

2.InitializeComponent()
 - XAML에 정의된 UI 요소들이 로드되고, 초기화 된다.

3. Loaded 이벤트
 - UI요소가 초기화되고 로드된 상태이지만, 아직 화면에는 그려지지 않은 상태다.

4. ContentRendered 이벤트
 - 모든 UI 요소들이 실제로 화면에 렌더링이 완료된 직후 발생하는 이벤트다.
   즉, 사용자가 눈으로 확인 가능한 시점이다.
 - 다만, ContentRendered 이벤트가 발생했다고 해서
   이후 추가적인 UI 업데이트나 이벤트 처리가 없다는 것을 의미하지는 않는다.
   이후에도 UI의 변경사항으로 인해 추가적인 렌더링이 이루어질 수 있다.

 

 

ContentRendered 이벤트는 실제로 UI 요소가 표시된 상태

즉, 화면이 사용자에게 보이는 순간 들어오는 이벤트이다.

해당 이벤트도 모든 UI 요소가 랜더링이 완료되었음을 보장하지만

ContentRendered 이벤트 이후 발생하는 상태도 있다


ApplicationIdle

ApplicationIdle 상태란?

WPF에서는 정확히 " ApplicationIdle"이라는 별도 이벤트가 존재하지는 않지만,

일반적으로 응용 프로그램이 유휴상태에 들어갔다고 표현할 때가 있다.

 

"유휴상태"의 정의는 다음과같다

모든 작업 큐가 비어있고, 현재 진행중인 모든 작업들이 완료된 상태

모든 UI 렌더링이 완료된 상태

바인딩 및 기타 모든 이벤트 처리가 완료된 상태

 

정리하자면, 아래 예제 코드의 실행 결과처럼 이벤트와 메서드 호출 순서를 이해할 수 있다.

 public MainWindow()
 {
     Console.WriteLine("1");

     InitializeComponent();

     Dispatcher.BeginInvoke(new Action(() =>
     {
         TestMethod();
     }), DispatcherPriority.ApplicationIdle);
 }

 private void Window_Loaded(object sender, RoutedEventArgs e)
 {
     Console.WriteLine("2");
 }

 private void Window_ContentRendered(object sender, EventArgs e)
 {
     Console.WriteLine("3");
 }

 private void TestMethod()
 {
     Console.WriteLine("4");
 }

 

ContentRenderedApplicationIdle 차이점비교

특징 ContentRendered ApplicationIdle
발생시점 UI가 처음으로 사용자에게 랜더링 완료된 직후 발생 모든 작업이 끝나고
큐가 비어 유휴상태가 되었을때 발생
발생빈도 한번만 발생 (초기 랜더링 후) 유휴 상태가 될 때마다 여러번 발생 가능
사용목적 초기 화면 랜더링 직후의 초기화 작업 랜더링 이후 유휴상태에서 부하가 적은 작업처리
적합한 작업 UI 표시 직후 실행할 초기화 작업 (애니메이션 등) UI업데이트 후 부수작