Что делает InitializeComponent()и как это работает в WPF?
В общем, во-первых, но мне было бы особенно интересно узнать мрачные детали порядка строительства и что происходит, когда есть Attached Properties.
Что делает InitializeComponent()и как это работает в WPF?
В общем, во-первых, но мне было бы особенно интересно узнать мрачные детали порядка строительства и что происходит, когда есть Attached Properties.
Ответы:
Вызов 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реализован в частично сгенерированном классе.
Надеюсь это поможет!
Просмотр кода всегда тоже помогает. То есть вы можете взглянуть на сгенерированный частичный класс (который вызывает LoadComponent ), выполнив следующие действия:
В YourClass .g.cs ... код для сгенерированного частичного класса. Опять же, если вы откроете это, вы увидите метод InitializeComponent и то, как он вызывает LoadComponent ... и многое другое.