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

что значит InitializeComponent() do, и как это работает в WPF?

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

2 ответов


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

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

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

Примечание: интересно, что InitializeComponent способ по System.Windows.Markup.IComponentConnector интерфейс, of который Window/UserControl реализовать в частично сгенерированном классе.

надеюсь, что это помогает!


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

  1. перейдите на панель Обозреватель решений в интересующем вас решении Visual Studio.
  2. в панели инструментов обозревателя решений есть кнопка "Показать все файлы". Переключи эту кнопку.
  3. теперь разверните параметр obj папка, а затем Debug или релиз папка (или любая конфигурация, которую вы создаете), и вы увидите файл под названием в yourclass.г.ЗС.

на в yourclass.г.ЗС ... код для созданного разделяемого класса. Опять же, если вы откроете это, вы можете увидеть метод InitializeComponent и как он вызывает LoadComponent ... и многое другое.