Що робить InitializeComponent () і як це працює у WPF?


166

Що робить InitializeComponent()і як це працює у WPF?

Загалом спочатку, але мені було б особливо цікаво дізнатись про найрізноманітніші деталі порядку будівництва та що відбувається, коли є додані властивості.


2
Дякую, я думаю, що це досить непогані відповіді нижче! Ніхто точно не згадував AttachedProperties, але тепер я знаю, що будь-які AttachedProperties у Xaml просто створені як частина розбору Xaml, тому вони дійсно не заслуговують на особливу згадку.
— Тім Ловелл-Сміт

Відповіді:


157

Виклик до 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реалізуємо в частково створеному класі.

Сподіваюся, це допомагає!


@Brad, як ти знайшов, у якому інтерфейсі визначено InitializeComponent? Довідка F1 щодо виклику у файлі .xaml.cs призводить до "сторінки не знайдено", а в .g.cs або .gics файл веде до класу Microsoft.SPOT.Emulator.EmulatorComponent. Я новачок у WPF. Чи цей метод генерується під час збирання?
— Ваймс

@ АртёмЦарионов Без виклику InitializeComponent в конструкторі елемент керування не відображатиметься і не може бути використаний у XAML, в якому він знаходиться.
— Джейсон

Цікаво. У мене склалося враження, що xaml використовується лише під час компіляції. Який сенс мати xaml під час виконання та де він зберігається?
— Jesper Matthiesen

Чому деякі методи дають мені "посилання на об'єкт не встановлюється на екземпляр об'єкта". ?
— Peter Gruppelaar

26

Перегляд коду завжди також допомагає. Тобто ви можете насправді подивитися на створений частковий клас (який викликає LoadComponent ), виконавши наступне:

  1. Перейдіть на панель Провідник рішень у рішенні Visual Studio, яке вас цікавить.
  2. На панелі інструментів Провідника рішень є кнопка під назвою «Показати всі файли». Перемкніть цю кнопку.
  3. Тепер розгорніть папку obj, а потім папку Налагодження або Випуск (або будь-яку конфігурацію, яку ви будуєте), і ви побачите файл під назвою YourClass .g.cs.

У YourClass .g.cs ... код для згенерованого часткового класу. Знову ж таки, якщо ви відкриєте це, ви можете побачити метод InitializeComponent і як він називає LoadComponent ... та багато іншого.


12
Зауважте, що ви можете зробити це за один крок, клацнувши правою кнопкою миші виклик методу в конструкторі та вибравши "Перейти до визначення".
— Бред Ліч

2
Ага, так ... забув про це. Набагато простіше так. Ну, принаймні ви знаєте, як це включено в проект. Грін.
— cplotts

1
@Brad Leach, Пізно до цієї вечірки, ви можете це зробити з F12
— Julius Depulla
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.