2009-03-16 3 views
7

나는 "창로드"XAML의에 의해 호출되는 방법 Window_Loaded()를 만드는 코드 예제를 보았다 이벤트 : XAML Window.Loaded라는 메서드에서 코드를 실행하는 이유는 무엇입니까?

<Window x:Class="TestModuleLoader.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Grid> 
     ... 
    </Grid> 
</Window> 

그러나 코드에

뒤에, 코드 생성자와 Window_Loaded() 방법 모두에서 일 :

using System.Windows; 

namespace TestModuleLoader 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      //what advantages do I have running code here? 
     } 
    } 
} 

이렇게하면 어떤 이점이 있습니까?

여기서 알 수있는 ASP.NET 에서처럼 "Window Load Cycle"이 있습니까? 예 : PreRender(), PostRender() 등과 같은 메소드가 있습니까?

답변

12

예, ASP.NET과 마찬가지로 WPF 컨트롤의 수명주기가 비슷합니다. WPF 컨트롤의 수명주기는 기본적으로 초기화되고,로드되고 언로드 된 이벤트 (이 순서대로)로 이루어지기 때문에 더 간단합니다.

http://msdn.microsoft.com/en-us/library/ms754221.aspx

및 마이크 Hillberg는 initalized 및로드 이벤트의 차이를 보여주는 훌륭한 기사가 있습니다 : 참조

http://blogs.msdn.com/mikehillberg/archive/2006/09/19/LoadedVsInitialized.aspx

+0

Mike Hillberg는 자신의 블로그에서 "사용할 이벤트가 확실하지 않으며 더 이상 읽지 않으려면 Loaded 이벤트를 사용하십시오"라고 말합니다. 우수, 나는 WPF로 잠시 오버로드 된 느낌이 들었고, 지금 당장 알 필요가있는 전부입니다. 링크 주셔서 감사합니다! –

+0

WPF가 약간 압도적으로 느낄 수 있습니다. 개인적으로 빙산의 일각을 본 것처럼 느껴집니다. – Razzie

3

우수한 링크를 즐즈을.

에드워드 - Interrupting Distinct는 Contructor가 항상 Window/Page/UserControl에서 호출 된 첫 번째 메서드이며, 최종 값으로 초기화 된 모든 DependencyProperties를 사용할 수는 없다는 것을 알 수 있습니다. 또한 construtructor 내에서 가상 메서드를 호출하는 것이 좋습니다.

대조적으로 Loaded 이벤트는 일반적으로 초기화 프로세스가 끝날 때 호출됩니다. 즉, Window/Page/UserControl이 WPF ElementTree에 완전히로드 된 경우입니다. 로드 된 이벤트 내에서 예상치 못한 결과가 발생할 위험없이 모든 메서드를 호출하고 DepenencyProperty를 수정할 수 있습니다.

(현재 프로젝트에서 사용하고있는) 멋진 패턴은로드 된 이벤트에서 사용자 지정 종속성 속성을 초기화하는 것입니다. 초기화 중에 수정되지 않은 경우입니다. 컨트롤의 경우이 패턴을 사용하면 덮어 쓰는 경우 (즉, 호출 코드에서 바인딩하는 속성에 의해) "값 비싼"속성 (예 : ObservableCollection 인 DependencyProperty)을 초기화하지 않아도됩니다.

간단한 답 : 생성자를 안전하게 오버로드하는 방법에 대해 잘 모르는 경우 Loaded 이벤트를 사용하십시오.

+0

좋은 요약 :-) – Razzie