Что делает 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 ... и многое другое.