3

まあ、私は認めなければなりません、それでも時々XAMLは私には少し不思議に思えます。重要なのは、「何が起こっているのか」と「どのように起こっているのか」を理解するために、C#コードを介してデバッグする(ブレークポイントをたくさん設定する)のが好きだったということです。しかし、オプションではない宣言型XAML構文を使用します。XAMLを操作すること、正確には、XAML宣言でどのように動作するかを「すでに知っている」既存のXAMLコードを操作/理解することに同意すると思います。アプリケーションコードの実行を調査することを知る/学ぶ方法はありません。ですから、私はXAMLを可能な限り詳細に裏返しに見てみることに興味があります。私はXAMLの「学習」について話しているのではなく、基本的なことを知っています。たぶん私は私が物事の種類を明確にするためにいくつかの例を提供することができます

  • C#コードと比較して、XMALでオブジェクトを使用すると、オブジェクトはどのようにインスタンス化されますか?それらはマネージヒープに格納されていますか?C#コードでインスタンス化されたオブジェクトと同じ方法ですか?
  • データ/コマンドバインディングにマークアップ拡張構文を使用しているときに、プロパティはどのように設定されますか?
  • INotifyPropertyChangedタイプのプロパティが更新されると、XAML構文内のBindingインスタンスがそれ自体をどのように更新しますか?そもそも、誰からどのくらい正確に通知されますか?
  • ビューモデルは、次のようにTyped DataTemplateを定義することにより、実行時にビューのDataContextとして設定できます 。実際にはどのように発生しますか?論理ツリーの上位にあるDataContextプロパティを検索する以外に、DataContextを設定するためのルールは何ですか?
    <DataTemplate DataType="{x:Type viewmodels:AccountsViewModel}">
    <views:Accounts/>
    </DataTemplate>

  • テンプレート全体(DataTemplate、ControlTemplate、ItemsPanelTemplate)が実行時にどのように処理/解決されるか。
  • などなどなど。

では、XAMLに精通している、経験がある、または専門家である場合、XAMLが「内部」でどのように機能するかを明確かつ深く理解するのに役立つ参照として、何を提案しますか(リンク、記事、ブログ投稿、書籍など)。前もって感謝します。

4

1 に答える 1

4

ほとんどは、XAMLを宣言型言語のような実際のプログラミング言語とは考えないことで説明できます。xamlで行うことはすべて、C#でも行うことができます。実際、これが起こっていることです。

C#コードと比較して、XMALでオブジェクトを使用すると、オブジェクトはどのようにインスタンス化されますか?それらはマネージヒープに格納されていますか?C#コードでインスタンス化されたオブジェクトと同じ方法ですか?

はい、それらは単なるc#オブジェクトであるためです。ほとんどのリソースは休止状態で保存されています。どこかで膨らんだ言葉を思い出しました。コンバーターまたはその他の「直接」c#オブジェクトは、必要に応じて作成されます。ここで重要なのは、これらのリソースは通常共有されるため、一度だけ作成されるということです。

データ/コマンドバインディングにマークアップ拡張構文を使用しているときに、プロパティはどのように設定されますか?

これも、マークアップ拡張機能を使用する場所によって異なります。スタイルで?テンプレートで?ウィンドウのようなインスタンス化されたユーザーコントロールでは?通常、実際に必要なときに評価されます。膨らんだスタイルが実際のリソースディクショナリに格納されている場合、それらを評価することは意味がありません。オブジェクトで実際にスタイルを使用すると、評価されます。

INotifyPropertyChangedタイプのプロパティが更新されると、XAML構文内のBindingインスタンスがそれ自体をどのように更新しますか?そもそも、誰からどのくらい正確に通知されますか?

バインディングエンジンによる。WPFは、DataContextがINotifyPropertyChangedインターフェイスを継承しているかどうかを確認し、インターフェイスによって提供されるイベントにアタッチして、変更をリッスンします。このようなイベントが発生した場合、バインディングエンジンはゲッターを再度呼び出します。

それは実際にどのように起こりますか?論理ツリーの上位にあるDataContextプロパティを検索する以外に、DataContextを設定するためのルールは何ですか?

要するに:他にはありません。Datacontextは、単に継承された添付プロパティです。子コントロールで再設定しない場合は、ルートに到達するまで親が持っている値を取ります。これに対する唯一の例外は、DataContextを継承しませんが、コンテンツに応じて変更することですContentControlsContentPresenterしたがって、これらのコントロールには、デフォルトで常にコンテンツがDataContextとして含まれています。

テンプレート全体(DataTemplate、ControlTemplate、ItemsPanelTemplate)が実行時にどのように処理/解決されるか。

簡単に言えば、WPFはUI以外のオブジェクトを見つけるたびに、指定されたタイプのDataTemplateを見つけようとします。MyClassたとえば、ItemsControlの場合: ;のリストをバインドできます。明示的なDataTemplateまたはDataTemplateSelectorを指定しない限り、暗黙的なスタイルを探すためにリソースツリーを上向きに検索します。繰り返しになりますが、これはXAMLでは発生していませんが、xamlから生成されたC#オブジェクトでは発生しています。

また、XAMLコードを使用してデバッグすることは(現在または近い将来に)可能ですか?

実行されないがコンパイル時に評価されるものをどのようにデバッグできると思いますか?

これを100%正しいと見なさないでください。何年にもわたって、これは私がXAMLと使用法に関する情報を集めたものです。修正がある場合、または明らかに間違っているものを見つけた場合。教えてください、私たちは皆学ぶためにここにいます、そして私はいつも私が使うものについて新しいことを学びます:)

于 2012-08-03T10:32:39.330 に答える