Что делает InitializeComponent () и как он работает в WPF? - PullRequest
151 голосов
/ 29 октября 2008

Что делает InitializeComponent() и как это работает в WPF?

В общем, во-первых, но мне было бы особенно интересно узнать кровавые подробности порядка построения и что происходит, когда есть Attached Properties.

Ответы [ 2 ]

147 голосов
/ 29 октября 2008

Вызов InitializeComponent() (который обычно вызывается в конструкторе по умолчанию как минимум Window и UserControl) на самом деле является вызовом метода частичного класса элемента управления (а не вызовом иерархии объектов как я и ожидал).

Этот метод находит URI для XAML для Window / UserControl, который загружается, и передает его статическому методу System.Windows.Application.LoadComponent(). LoadComponent() загружает файл XAML, расположенный в переданном в URI, и преобразует его в экземпляр объекта, указанный корневым элементом файла XAML.

Более подробно, LoadComponent создает экземпляр XamlParser и строит дерево XAML. Каждый узел анализируется XamlParser.ProcessXamlNode(). Это передается классу BamlRecordWriter. Через некоторое время я немного теряюсь в том, как BAML преобразуется в объекты, но этого может быть достаточно, чтобы помочь вам на пути к просветлению.

Примечание. Интересно отметить, что InitializeComponent - это метод интерфейса System.Windows.Markup.IComponentConnector, из которого Window / UserControl реализуется в частично сгенерированном классе.

Надеюсь, это поможет!

22 голосов
/ 29 октября 2008

Просмотр кода всегда тоже помогает. То есть вы можете взглянуть на сгенерированный частичный класс (который вызывает LoadComponent ), выполнив следующее:

  1. Перейдите на панель обозревателя решений в интересующем вас решении Visual Studio.
  2. На панели инструментов обозревателя решений есть кнопка «Показать все файлы». Переключить эту кнопку.
  3. Теперь разверните папку obj , а затем папку Debug или Release (или любую конфигурацию, которую вы создаете), и вы увидите файл с названием YourClass .g.cs.

YourClass .g.cs ... - это код сгенерированного частичного класса. Опять же, если вы откроете это, вы увидите метод InitializeComponent и то, как он вызывает LoadComponent ... и многое другое.

...