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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

  • Перейдите в панель Solution Explorer в интересующем вас решении Visual Studio.
  • На панели инструментов обозревателя решений есть кнопка "Показать все файлы". Переключите эту кнопку.
  • Теперь разверните папку obj, а затем папку Отладка или Отпустите (или любую другую конфигурацию, которую вы строите), и вы увидите файл под названием YourClass.g.cs.

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