2

では、親の にリンクする子オブジェクトの幅にバインディングを配置するとActualWidth、どうなるでしょうか?

私の推測では、親は子が必要とする幅を測定し、子は親に 0 の幅を伝え、その後親は配置中に実際のスペースを与えられ、子は何も望まなかったので子にゼロを与えようとします。次に、親に与えられたスペースの実際の幅により、バインディングによって子の幅が変更されます。この時点で、レイアウトが再度実行されると思います。

ただし、これはバインディングがそれほど速く伝播しないことを前提としています。バインドされた値がいつターゲットに伝播するのか、私はまだぼんやりしています。それはすべて、親の actualwidth 値がいつ変更されるかによって異なります。これは、レイアウトが完了した後に発生しますか? そして、バインドされたピースが更新されますか? すべてのバインディングは、現在実行中のコードを中断してターゲット値を更新しますか? そうでない場合、あるバインディングが再描画を必要とする変更を伝播し、別のバインディングが再描画を引き起こす別の変更を伝播すると、問題が発生しませんか?

一部の人々は、私の実際の問題は何かと尋ねました。

そのため、最初は、使用可能なスペースを埋めるためにコントロール ストレッチが必要でした。十分に単純ですが、スクロールビューアーにしたかったのです。Scrollviewer は、測定中に子に無限のスペースを与えます。代わりに、子コントロールの幅と高さを親の実際の幅と実際の高さにバインドできます。レイアウトは 2 回目のパスを行い、すべてがうねりのように見えます。

ただし、後で、コントロールテンプレートでコントロールを拡大する同様の種類の問題が発生しましたが、最小幅と配置 = ストレッチを設定して拡大できることがわかりました。

しかし、以前に他のコントロールでそれを試してみてうまくいかなかったことをはっきりと覚えていたので、戻って2つのケースの違いを理解しようとしました. 基本的に、そのうちの 1 つが数レベル上のスタックパネルにあるということになりました。

そのため、一方にバインディングを使用し、もう一方に minwidth とアライメント メソッドを使用しています。とにかく、私がやっている方法が後で奇妙なバグを作成しないようにするために、これにのみ興味がありました.

幅または高さが変更されたときにレイアウトがすぐに実行されないことを望んでいますが、代わりにシステムがサイズの変更を定期的に再チェックします

4

1 に答える 1

3

DispatherPriority enumによると、 の前にDataBinding発生しRenderingます。

  • 送信
  • 通常- コンストラクターはここで実行されます
  • データバインド
  • 与える
  • ロード済み
  • バックグラウンド
  • コンテキストアイドル
  • アプリケーションアイドル
  • システムアイドル
  • 非活性
  • 無効
  • 入力

そのため、バインディングはレンダリングが発生する前に最初に評価を試みます。

ただし、レンダリングによってバインディングが更新される可能性があるため、親パネルをレンダリングするプロセスによってパネルの幅が増加する場合 (たとえば、親パネルが別のパネル内に配置され、その子を自動的に拡大してスペースの 100% を占有する場合)Gridまたは ) の最後の要素のようDockPanelに、バインディングの更新をトリガーし、レンダリング サイクル中に子の幅を増やします。

このSO回答の2番目の部分も理解に役立つ場合があります。#6も注意してください。

Window が作成されて表示されるときのイベントのシーケンス

要求に応じて、ウィンドウが作成されて表示されるときの WPF の主要なイベントのシーケンスを次に示します。

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

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

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

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

  5. ウィンドウとその子孫 (論理とビジュアルの両方) が Loaded イベントを受け取る

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

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

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

于 2013-07-12T01:12:15.503 に答える