InitializeComponent()は何をし、WPFではどのように機能しますか?


166

InitializeComponent()WPFでは何が行われ、どのように機能しますか?

一般的には最初に、しかし特に私は特に、建設の順序の残酷な詳細と、添付プロパティがある場合に何が起こるかを知りたいと思います。


2
ありがとう、これらは以下のかなり良い答えだと思います!だれもAttachedPropertiesについて正確に言及していませんが、XamlのAttachedPropertiesはXaml解析の一部として作成されるだけであるため、特に言及する必要はありません。
Tim Lovell-Smith、

回答:


157

呼び出しInitializeComponent()(通常は少なくとものデフォルトコンストラクタで呼び出されるWindowと、UserControl)は、実際にはコントロールの部分クラスへのメソッド呼び出しです(最初に期待したオブジェクト階層を呼び出すのではありません)。

このメソッドは、ロードしているWindow/ のXAMLへのURIを特定し、UserControlそれをSystem.Windows.Application.LoadComponent()静的メソッドに渡します。LoadComponent()渡されたURIにあるXAMLファイルをロードし、XAMLファイルのルート要素で指定されたオブジェクトのインスタンスに変換します。

より詳細にLoadComponentは、のインスタンスを作成しXamlParser、XAMLのツリーを構築します。各ノードはによって解析されますXamlParser.ProcessXamlNode()。これはBamlRecordWriterクラスに渡されます。この後しばらくして、BAMLがオブジェクトに変換される方法で少し迷子になりますが、これで十分に悟りへの道を進むことができます。

注:興味深いことに、これInitializeComponentSystem.Windows.Markup.IComponentConnectorインターフェース上のメソッドであり、そのWindow/ UserControl部分的に生成されたクラスに実装されます。

お役に立てれば!


@Brad、どのようにしてInitializeComponentが定義されているインターフェイスを見つけましたか?.xaml.csファイルでの呼び出しのF1ヘルプは、「ページが見つかりません」につながりますが、.g.csまたは.gicsファイルでは、Microsoft.SPOT.Emulator.EmulatorComponentクラスにつながります。WPFは初めてです。このメソッドはビルド時に生成されますか?
Vimes 2013

@АртёмЦарионовコンストラクターでInitializeComponentを呼び出さないと、コントロールは表示されないか、コントロールが配置されているXAMLで使用できません。
Jason

面白い。xamlはコンパイル時にのみ使用されるという印象を受けました。実行時にxamlを使用できるようにして、どこに保存するのですか?
Jesper Matthiesen、2015年

一部のメソッドで「オブジェクト参照がオブジェクトのインスタンスに設定されていません」と表示されるのはなぜですか。?
Peter Gruppelaar 2017年

26

コードを確認することも常に役立ちます。つまり、次のようにして、実際に(LoadComponentを呼び出す)生成された部分クラスを確認できます。

  1. 目的のVisual Studioソリューションのソリューションエクスプローラーペインに移動します。
  2. ソリューションエクスプローラーのツールバーに[すべてのファイルを表示]というボタンがあります。そのボタンを切り替えます。
  3. 次に、objフォルダーを展開し、次にDebugまたはReleaseフォルダー(または構築している構成)を展開すると、YourClass .g.cs という名前のファイルが表示されます。

YOURCLASSの .g.cs ...生成された部分クラスのコードです。繰り返しますが、これを開くと、InitializeComponentメソッドと、LoadComponentの呼び出し方法などを確認できます。


12
これは、コンストラクターでメソッド呼び出しを右クリックして[定義に移動]を選択することで、1つのステップで実行できることに注意してください。
Brad Leach、

2
ああ、そうです...忘れていました。その方がずっと簡単です。まあ、少なくともあなたはそれがプロジェクトにどのように含まれているのか知っています。グリン。
cplotts 2008年

1
@Brad Leach、このパーティーの後半、F12でそれを行うことができます
Julius Depulla
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.