2011-11-08 15 views
2

[この質問に該当する] 2つのクラスがあります。最初は、XYAxes2FrameworkElementです。それは、唯一の子、XAxis(またFrameworkElementまで伸ばす)を所望の位置に置くために、MeasureOverrideArrangeOverrideを無効にします。FramworkElement子を配置しないように配置するFramworkElement

XYAxes2(親):

Scale XAxis =//... 
protected override Size MeasureOverride(Size availableSize) { 
    XAxis.Measure(availableSize); 
    return (Size)availableSize; 
} 
protected override Size ArrangeOverride(Size finalSize) { 
    XAxis.Arrange(new Rect(50, 50, 100, 200)); 
    return finalSize; 
} 

Scaleカスタム描か成分です。 Scale(子供):

protected override void OnRender(DrawingContext cx) { 
    ValidateTicks(); 
    if (Orientation == Orientation.Horizontal) { 
     cx.DrawLine(Pen, new Point(-.5, .5), new Point(ActualWidth - .5, .5)); 
     foreach (double tick in _ticks.Keys) { 
      double val = ScaleTransformCallback(tick); 
      double x = -0.5 + (int)((val - MinValue) * ActualWidth/(MaxValue - MinValue)); 
      cx.DrawLine(Pen, new Point(x, .5), new Point(x, TickLength - .5)); 
      FormattedText txt = _ticks[tick]; 
      cx.DrawText(txt, new Point(x - txt.Width/2, TickLength + TextMargin)); 
     } 
    } else { 
     double Left = maxTextWidth + 2 * TextMargin; 
     double Right = this.TickLength + Left; 
     cx.DrawLine(Pen, new Point(Right - .5, +.5), new Point(Right - .5, ActualHeight + .5)); 
     foreach (double tick in _ticks.Keys) { 
      double val = ScaleTransformCallback(tick); 
      double y = -0.5 + ActualHeight - (int)((val - MinValue) * ActualHeight/(MaxValue - MinValue)); 
      cx.DrawLine(Pen, new Point(Right - .5, y), new Point(Left - .5, y)); 
      FormattedText txt = _ticks[tick]; 
      cx.DrawText(txt, new Point(Left - txt.Width - TextMargin, y - txt.Height/2)); 
     } 
    } 
} 

、しかし、ArrangeOverrideによって指定された領域に、デバッグ、この機能でActualWidthは、常に親の幅ではなく、ArrangeOverrideによって設定された幅で、100子をクリップしています。

私はこれらの機能のいずれかで何か問題がありますか?

編集:ArrangeOverrideXAxis.Measure(100,200)を挿入すると、明らかに問題は解決されます。確かに、アレンジメントが無効になるたびにMeasureに電話する必要はありません(InvalidateArrangeは暗黙のうちにInvalidateMeasureを呼び出す必要があります)。この背後にある原因に誰かが光を当てることはできますか?

DesiredSizeActualWidth/Heightが実際に設定されている場所は誰でも知っていますか(明らかに私のコードでは設定されていません)。

+0

DesiredSizeは、通常、Mesasureの通過後に設定され、ActualWidth/Heightは、コントロールが配置/レンダリング(?)された後に設定されます。その音で、Measure(double.PositiveInfinity、doublePositiveInfinity)を呼び出す必要があります。結局のところ、Draw *がMeasure/Arrangeレイアウトのパラダイムに収まるとは思わない。 –

答えて

1

私がこれに対して使用した解決策は、MeasureOverride関数で複数のパスを使用することです。私は適切な全体のサイズが決定されるまで、さまざまなサイズで測定を続けます。 .NET 4.0のソースコードを読み取ることにより

は、それが表示されること: -

  • DesiredSizeMeasureOverrideの 戻り値にUIElement.Measure関数によって設定されています。

  • ActualWidth/ActualHeightRenderSize)が適用される任意のエラーチェックや 丸めがあるように表示されません ArrangeOverrideから返されるどのような値であることを FrameworkElement.ArrangeCoreによって設定されています。

これは他の人に役立つことを願っています。

関連する問題