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

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

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


person Tim Lovell-Smith    schedule 29.10.2008    source источник
comment
Спасибо, я думаю, это довольно хорошие ответы ниже! Никто точно не упомянул AttachedProperties, но теперь я знаю, что любые AttachedProperties в Xaml просто создаются как часть синтаксического анализа Xaml, поэтому они не заслуживают особого упоминания.   -  person Tim Lovell-Smith    schedule 21.10.2009


Ответы (2)


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

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

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

Примечание. Интересно, что InitializeComponent - это метод интерфейса System.Windows.Markup.IComponentConnector, который _14 _ / _ 15_ реализуется в частично сгенерированном классе.

Надеюсь это поможет!

person Brad Leach    schedule 29.10.2008
comment
@Brad, как вы узнали, в каком интерфейсе определен InitializeComponent? Справка F1 по вызову в файле .xaml.cs ведет к странице, которая не найдена, а в файле .g.cs или .g.i.cs ведет к классу Microsoft.SPOT.Emulator.EmulatorComponent. Я новичок в WPF. Этот метод создается во время сборки? - person Vimes; 20.04.2013
comment
@ АртёмЦарионов Без вызова InitializeComponent в конструкторе элемент управления не будет отображаться или использоваться в XAML, в котором он расположен. - person Jason Rae; 03.10.2013
comment
Интересно. У меня создалось впечатление, что xaml использовался только во время компиляции. Какой смысл в том, чтобы xaml был доступен во время выполнения и где он хранится? - person Jesper Matthiesen; 24.11.2015
comment
Почему некоторые методы дают мне ссылку на объект, которая не установлена ​​на экземпляре объекта. ? - person Peter Gruppelaar; 23.11.2017
comment
@JesperMatthiesen Может быть, для горячей перезагрузки? Чтобы во время отладки изменения XAML отражались во время выполнения без необходимости перезапускать / перекомпилировать приложение. - person Michael Schnerring; 25.08.2020

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

  1. Перейдите в панель обозревателя решений в интересующем вас решении Visual Studio.
  2. На панели инструментов обозревателя решений есть кнопка «Показать все файлы». Переключите эту кнопку.
  3. Теперь разверните папку obj, а затем папку Debug или Release (или любую другую конфигурацию, которую вы создаете), и вы увидите файл с названием < em> YourClass .g.cs.

YourClass .g.cs ... - это код для сгенерированного частичного класса. Опять же, если вы откроете его, вы увидите метод InitializeComponent и то, как он вызывает LoadComponent ... и многое другое.

person cplotts    schedule 29.10.2008
comment
Обратите внимание, что вы можете сделать это за один шаг, щелкнув правой кнопкой мыши вызов метода в конструкторе и выбрав «Перейти к определению». - person Brad Leach; 29.10.2008
comment
Ах да ... забыл об этом. Так намного проще. Ну вы хоть знаете, как это входит в проект. Ухмылка. - person cplotts; 30.10.2008
comment
@Brad Leach, Поздно на вечеринке, ты можешь сделать это с помощью F12 - person Julius Depulla; 05.12.2015