Вопрос

Что делает 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 ), выполнив следующие действия:

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top