1

私はしばらくの間そのような説明を探していました、そして私はまだ何も見つけることができませんでした。問題は、Wpfコントロールの初期化/作成プロセスの手順を知りたいということです。

簡単なボタンを見てみましょう。コンストラクターが呼び出されたときに何が起こっているのか、visualTree / logicTreeにコントロールが追加されたのはいつか、dependencyproperty値の呼び出しはいつ行われたのか、ApplyTemplate()はいつ呼び出されたのかを知りたいです。

適切なカスタムコントロールを記述できるようにするには、この情報が必要です。コントロールのコンストラクター内で呼び出されたときにthis.Template.FindName( "test")が常に "null"を返すのはなぜか、他の人にも役立つと思います。

誰かがこれに答えたり、コントロールを初期化する概念が簡潔に説明されているチュートリアルのリンクを提供してくれますか?

ありがとう :)

4

1 に答える 1

1

このSOごとにここで答えます

ウィンドウが作成されて表示されたときの一連のイベント

要求に応じて、ウィンドウが作成および表示されたときのWPFの主要なイベントのシーケンスは次のとおりです。

  1. コンストラクターとゲッター/セッターは、オブジェクトが作成されるときに呼び出されます。これには、更新されるオブジェクトとそれらから継承するオブジェクトに対するPropertyChangedCallback、ValidationCallbackなどが含まれます。

  2. 各要素がビジュアルツリーまたは論理ツリーに追加されると、その初期化イベントが発生します。これにより、定義できる要素固有の初期化に加えて、スタイルとトリガーが適用されていることがわかります[注:論理ツリーの葉に対して初期化されたイベントは発生しませんルートにPresentationSource(ウィンドウなど)がない場合]

  3. ウィンドウとその上のすべての折りたたまれていないビジュアルが測定されます。これにより、各コントロールでApplyTemplateが発生し、より多くのコンストラクターとゲッター/セッターを含む追加のオブジェクトツリーが構築されます。

  4. ウィンドウとその上のすべての折りたたまれていないビジュアルが配置されます

  5. ウィンドウとその子孫(論理的および視覚的の両方)は、Loadedイベントを受け取ります

  6. 最初に設定されたときに失敗したデータバインディングは再試行されます

  7. ウィンドウとその子孫には、コンテンツを視覚的にレンダリングする機会が与えられます

手順1〜2は、ウィンドウが表示されているかどうかに関係なく、ウィンドウの作成時に実行されます。他の手順は通常、ウィンドウが表示されるまで実行されませんが、手動でトリガーすると、より早く実行される可能性があります。

また、私は個人的にDispatcherPriorityEnumがイベントの順序を決定するのに役立つ場合があることを発見しました

  • 無効
  • 非活性
  • SystemIdle
  • ApplicationIdle
  • ContextIdle
  • バックグラウンド
  • 入力
  • ロード済み
  • 与える
  • DataBind
  • 通常-コンストラクターはここで実行されます
  • 送信
于 2012-12-13T14:00:08.953 に答える