Що робить 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.