O que InitializeComponent () faz e como funciona no WPF?

166

O que InitializeComponent()faz e como funciona no WPF?

Em geral, primeiro, mas eu estaria especialmente interessado em conhecer os detalhes sangrentos da ordem de construção e o que acontece quando existem Propriedades Anexadas.

Tim Lovell-Smith
fonte
2
Obrigado, acho que estas são boas respostas abaixo! Ninguém mencionou exatamente as AttachedProperties, mas agora eu sei que quaisquer AttachedProperties no Xaml são criadas apenas como parte da análise do Xaml, para que realmente não mereçam uma menção especial.
Tim Lovell-Smith

Respostas:

157

A chamada para InitializeComponent()(que geralmente é chamada no construtor padrão de pelo menos Windowe UserControl) é na verdade uma chamada de método para a classe parcial do controle (em vez de uma chamada para a hierarquia de objetos, como eu esperava inicialmente).

Esse método localiza um URI no XAML para o Window/ UserControlque está sendo carregado e o passa para o System.Windows.Application.LoadComponent()método estático. LoadComponent()carrega o arquivo XAML localizado no URI passado e o converte em uma instância do objeto especificado pelo elemento raiz do arquivo XAML.

Mais detalhadamente, LoadComponentcria uma instância do XamlParsere cria uma árvore do XAML. Cada nó é analisado pelo XamlParser.ProcessXamlNode(). Isso é passado para a BamlRecordWriterclasse. Algum tempo depois disso, fico um pouco perdido na forma como o BAML é convertido em objetos, mas isso pode ser suficiente para ajudá-lo no caminho da iluminação.

Nota: Curiosamente, o InitializeComponenté um método na System.Windows.Markup.IComponentConnectorinterface, do qual Window/ UserControlimplementa na classe gerada parcial.

Espero que isto ajude!

Brad Leach
fonte
@ Brad, como você encontrou em qual interface InitializeComponent está definido? A ajuda F1 na chamada no arquivo .xaml.cs leva a "página não encontrada", enquanto no arquivo .g.cs ou .gics leva à classe Microsoft.SPOT.Emulator.EmulatorComponent. Eu sou novo no WPF. Este método é gerado no tempo de construção?
Vimes
@ АртёмЦарионов Sem uma chamada para InitializeComponent no construtor, o controle não será exibido ou poderá ser usado no XAML em que está localizado.
Jason
Interessante. Fiquei com a impressão de que o xaml era usado apenas durante a compilação. Qual o sentido de ter o xaml disponível no tempo de execução e onde ele é armazenado?
precisa
Por que alguns métodos me dão uma "referência de objeto não está definida em uma instância de um objeto". ?
Peter Gruppelaar
26

Olhar para o código sempre ajuda também. Ou seja, você pode realmente dar uma olhada na classe parcial gerada (que chama LoadComponent ) fazendo o seguinte:

  1. Vá para o painel Gerenciador de Soluções na solução Visual Studio em que você está interessado.
  2. Há um botão na barra de ferramentas do Gerenciador de Soluções intitulado 'Mostrar todos os arquivos'. Alterne esse botão.
  3. Agora, expanda a pasta obj e, em seguida, a pasta Debug ou Release (ou qualquer configuração que você esteja criando) e você verá um arquivo intitulado YourClass .g.cs.

O YourClass .g.cs ... é o código para a classe parcial gerada. Novamente, se você abrir isso, poderá ver o método InitializeComponent e como ele chama LoadComponent ... e muito mais.

cplotts
fonte
12
Observe que você pode fazer isso em uma etapa clicando com o botão direito do mouse na chamada do método no construtor e selecionando "Ir para a definição".
Brad Leach
2
Ah, isso mesmo ... esqueci disso. Muito mais fácil assim. Bem, pelo menos você sabe como isso está incluído no projeto. Sorrir.
Cplotts
1
@Brad Leach, Tarde para esta festa, você pode fazê-lo com a F12
Julius Depulla