What does InitializeComponent() do, and how does it work in WPF?

168,222

Solution 1

The call to InitializeComponent() (which is usually called in the default constructor of at least Window and UserControl) is actually a method call to the partial class of the control (rather than a call up the object hierarchy as I first expected).

This method locates a URI to the XAML for the Window/UserControl that is loading, and passes it to the System.Windows.Application.LoadComponent() static method. LoadComponent() loads the XAML file that is located at the passed in URI, and converts it to an instance of the object that is specified by the root element of the XAML file.

In more detail, LoadComponent creates an instance of the XamlParser, and builds a tree of the XAML. Each node is parsed by the XamlParser.ProcessXamlNode(). This gets passed to the BamlRecordWriter class. Some time after this I get a bit lost in how the BAML is converted to objects, but this may be enough to help you on the path to enlightenment.

Note: Interestingly, the InitializeComponent is a method on the System.Windows.Markup.IComponentConnector interface, of which Window/UserControl implement in the partial generated class.

Hope this helps!

Solution 2

Looking at the code always helps too. That is, you can actually take a look at the generated partial class (that calls LoadComponent) by doing the following:

  1. Go to the Solution Explorer pane in the Visual Studio solution that you are interested in.
  2. There is a button in the tool bar of the Solution Explorer titled 'Show All Files'. Toggle that button.
  3. Now, expand the obj folder and then the Debug or Release folder (or whatever configuration you are building) and you will see a file titled YourClass.g.cs.

The YourClass.g.cs ... is the code for generated partial class. Again, if you open that up you can see the InitializeComponent method and how it calls LoadComponent ... and much more.

Share:
168,222

Related videos on Youtube

Tim Lovell-Smith
Author by

Tim Lovell-Smith

Updated on October 09, 2020

Comments

  • Tim Lovell-Smith
    Tim Lovell-Smith over 3 years

    What does InitializeComponent() do, and how does it work in WPF?

    In general first, but I would especially be interested to know the gory details of order of construction, and what happens when there are Attached Properties.

  • Larsi
    Larsi over 15 years
    Note that you can do this in one step by right clicking the method call in the constructor and selecting "Go to Definition".
  • cplotts
    cplotts over 15 years
    Ah, that's right ... forgot about that. Much easier that way. Well, at least you know how it is included in the project. Grin.
  • Vimes
    Vimes about 11 years
    @Brad, how did you find which interface InitializeComponent is defined in? F1 help on the call in the .xaml.cs file leads leads to "page not found" while in .g.cs or .g.i.cs file leads to the Microsoft.SPOT.Emulator.EmulatorComponent class. I'm new to WPF. Is this method generated at build time?
  • Jason Rae
    Jason Rae over 10 years
    @АртёмЦарионов Without a call to InitializeComponent in the constructor, the control will not display or be usable in the XAML in which it is located.
  • Jesper Matthiesen
    Jesper Matthiesen over 8 years
    Interesting. I was under the impression that the xaml was only used during compilation.. What point is it to have the xaml available at runtime and where is it stored?
  • Julius Depulla
    Julius Depulla over 8 years
    @Brad Leach, Late to this party, you can do it with F12
  • Peter Gruppelaar
    Peter Gruppelaar over 6 years
    Why do some methods give me a "object reference is not set on an instance of an object." ?
  • Michael Schnerring
    Michael Schnerring almost 4 years
    @JesperMatthiesen Maybe for hot reloading? So that during debugging changes to XAML get reflected during runtime without having to restart / recompile the application.