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