2

カスタムパネルを持つカスタムコントロールに取り組んでおり、カスタムパネル内には、サイズを子メソッドMeasureOverrideに渡す小さくて単純なメソッドがあります。カスタム パネルがレイアウトを処理し、ウィンドウ サイズに応じて子を大きくまたは小さくする必要があります。double.PositiveInfinityMeasureOverride

コントロールを扱ったことがある場合は、wpf レイアウト システムの仕組みと、基本的にすべての子が子の子の MeasureOverride を呼び出す MeasureOverride などを呼び出すことを知っておく必要があります。

ここでの問題は、ウィンドウのサイズを変更すると、カスタムパネルが再度測定を行うためのフラグを受け取るため、再度MeasureOverride呼び出されることですが、今回はdouble.PositiveInfitintyサイズを子に渡すときに、子MeasureOverrideがまったく呼び出されないことです。 (ただし、メソッドは WPF レイアウト システムの定義に従って呼び出す必要があります)。どうしてこんなことに?MeasureOverride親に電話すると、子供たちも対策を迫られるのではないかといつも思っていました。

明らかに私は間違っているので、誰かがコントロール/子供がいつ再測定するかをどのように知っているか説明してもらえますか?

ちなみに、私はdouble.PositiveInfinity子供たちに のサイズを渡して、必要なだけスペースを取るように伝えています。

コード:

protected override Size MeasureOverride(Size availableSize)
{
 double x;
 double y;
 var children = this.InternalChildren;
 for (int i = 0; i < children.Count; i++)
     {
       UIElement child = children[i];
       child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity);
       y += child.DesiredSize.Height;
       x = Math.Max(x, child.DesiredSize.Width);
      }
 return new Size(x, y);
}

コードは簡単です。子供たちが再び測定されない理由がわかりません。コードでスペルミスがあった場合は申し訳ありません。

4

2 に答える 2

2

同じサイズを渡し続けるため、WPF は、結果が同じになるため、再度測定する理由がないことを認識していDesiredSizeます。

そうは言っても、Desiredsize更新者Measureは、お子様が最も適切と考えるサイズのみです。をオーバーライドするときはそれを考慮に入れる必要がありますArrangeOverrideが、義務はありません: 好きなように子供を配置するだけで、子供のMeasureOverrideために呼び出されるかどうかは関係ありません。

于 2013-02-08T15:41:32.387 に答える
0

親パネルのUIElement.InvalidateMeasure場所を呼び出してみましたか?UIElement

于 2013-02-08T15:21:27.763 に答える