web-dev-qa-db-ja.com

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

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

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

152

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

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

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

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

お役に立てれば!

148
Brad Leach

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

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

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

22
cplotts