Что делает 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) следующим образом:
- перейдите на панель Обозреватель решений в интересующем вас решении Visual Studio.
- в панели инструментов обозревателя решений есть кнопка "Показать все файлы". Переключи эту кнопку.
- теперь разверните параметр obj папка, а затем Debug или релиз папка (или любая конфигурация, которую вы создаете), и вы увидите файл под названием в yourclass.г.ЗС.
на в yourclass.г.ЗС ... код для созданного разделяемого класса. Опять же, если вы откроете это, вы можете увидеть метод InitializeComponent и как он вызывает LoadComponent ... и многое другое.