InitializeComponent ()의 기능은 무엇이며 WPF에서 어떻게 작동합니까?


166

InitializeComponent()WPF에서 어떤 기능을 수행하며 어떻게 작동합니까?

일반적으로 먼저, 나는 특히 건설 순서에 대한 까다로운 세부 사항과 부착 된 속성이있을 때 어떻게되는지 알고 싶습니다.


2
고마워, 나는 이것들이 꽤 좋은 답변이라고 생각합니다! 아무도 AttachedProperties를 정확하게 언급하지 않았지만 이제는 Xaml의 AttachedProperties가 Xaml 구문 분석의 일부로 생성 된 것이므로 특별한 언급이 필요하지 않습니다.
Tim Lovell-Smith

답변:


157

에 대한 호출 InitializeComponent()(보통 적어도 Windowand 의 기본 생성자에서 UserControl호출 됨)은 실제로 컨트롤의 부분 클래스에 대한 메서드 호출입니다 (처음에 예상 한대로 객체 계층을 호출하는 것이 아니라).

이 메서드 는로드 중인 Window/ 에 대한 XAML에 대한 URI를 찾아 정적 메서드에 UserControl전달합니다 System.Windows.Application.LoadComponent().LoadComponent()전달 된 URI에있는 XAML 파일을로드하고 XAML 파일의 루트 요소에 의해 지정된 객체의 인스턴스로 변환합니다.

보다 자세하게 LoadComponent는의 인스턴스를 만들고 XamlParserXAML의 트리를 만듭니다. 각 노드는로 구문 분석됩니다 XamlParser.ProcessXamlNode(). 이것은 BamlRecordWriter수업에 전달됩니다 . 얼마 후 BAML이 객체로 변환되는 방식에서 약간의 손실이 발생하지만 이것은 깨달음의 길을 찾는 데 도움이 될 수 있습니다.

참고 : 흥미롭게도 인터페이스 InitializeComponent의 메소드 는 부분 생성 클래스에서 / 구현됩니다.System.Windows.Markup.IComponentConnectorWindowUserControl

도움이 되었기를 바랍니다!


@Brad, InitializeComponent가 정의 된 인터페이스를 어떻게 찾았습니까? .xaml.cs 파일의 호출에 대한 F1 도움말은 "페이지를 찾을 수 없음"으로 이어지고 .g.cs 또는 .gics 파일에서는 Microsoft.SPOT.Emulator.EmulatorComponent 클래스로 연결됩니다. WPF를 처음 사용합니다. 이 메소드는 빌드시 생성됩니까?
Vimes

@ АртёмЦарионов 생성자에서 InitializeComponent를 호출하지 않으면 컨트롤이있는 XAML에서 컨트롤을 표시하거나 사용할 수 없습니다.
Jason

흥미 롭군 나는 xaml이 컴파일 중에 만 사용되었다는 인상을 받았다. 런타임에 xaml을 사용할 수 있고 어디에 저장되어 있습니까?
Jesper Matthiesen

왜 일부 메소드가 "객체의 인스턴스에 객체 참조가 설정되어 있지 않습니다." ?
피터 Gruppelaar

26

코드를 보면 항상 도움이됩니다. 즉, 실제로 다음을 수행하여 생성 된 부분 클래스 ( LoadComponent 호출 )를 볼 수 있습니다 .

  1. 관심있는 Visual Studio 솔루션의 솔루션 탐색기 창으로 이동하십시오.
  2. 솔루션 탐색기의 도구 모음에는 '모든 파일 표시'라는 단추가 있습니다. 그 버튼을 토글하십시오.
  3. 이제 obj 폴더를 확장 한 다음 Debug 또는 Release 폴더 (또는 작성중인 구성)를 확장하면 YourClass .g.cs 라는 파일이 표시됩니다 .

YourClass의 .g.cs ... 생성 된 부분 클래스의 코드입니다. 다시 한 번 열어 보면 InitializeComponent 메소드와 LoadComponent 호출 방법 등을 볼 수 있습니다.


12
생성자에서 메소드 호출을 마우스 오른쪽 단추로 클릭하고 "정의로 이동"을 선택하여 한 번에 수행 할 수 있습니다.
Brad Leach

2
아, 맞아 ... 잊어 버렸어. 훨씬 더 쉽습니다. 글쎄, 적어도 프로젝트에 어떻게 포함되어 있는지 알고 있습니다. 이를 드러내고 웃다.
cplotts

1
@Brad Leach,이 파티에 늦게, 당신은 F12와 함께 할 수 있습니다
Julius Depulla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.