[この質問に該当する] 2 つのクラスがあります。最初の ,XYAxes2
は を拡張しFrameworkElement
ます。オーバーライドMeasureOverride
し、その唯一の子( extends も含む) を目的の位置に配置ArrangeOverride
しようとします。XAxis
FrameworkElement
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 ) );
}
}
}
デバッグ時ActualWidth
、この関数では、 で設定された幅ではなく、常に親の幅がArrangeOverride
100 になります。ただし、子は で指定された領域にクリップされArrangeOverride
ます。
これらの関数のいずれかで何か間違ったことをしていますか?
編集:に挿入することによりXAxis.Measure(100,200)
、ArrangeOverride
問題は明らかに修正されます。確かにMeasure
、取り決めが無効になるたびに呼び出す必要はないはずです (これはInvalidateArrange
、暗黙的に を呼び出す必要があることを意味しますInvalidateMeasure
)。この背後にある原因を明らかにできる人はいますか?
誰かが実際に設定されている場所DesiredSize
を知っていますかActualWidth/Height
(明らかに、私のコードでは設定されていません)?