[この質問に該当する] 2つのクラスがあります。最初は、XYAxes2
、FrameworkElement
です。それは、唯一の子、XAxis
(またFrameworkElement
まで伸ばす)を所望の位置に置くために、MeasureOverride
とArrangeOverride
を無効にします。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子をクリップしています。
私はこれらの機能のいずれかで何か問題がありますか?
編集:ArrangeOverride
にXAxis.Measure(100,200)
を挿入すると、明らかに問題は解決されます。確かに、アレンジメントが無効になるたびにMeasure
に電話する必要はありません(InvalidateArrange
は暗黙のうちにInvalidateMeasure
を呼び出す必要があります)。この背後にある原因に誰かが光を当てることはできますか?
DesiredSize
とActualWidth/Height
が実際に設定されている場所は誰でも知っていますか(明らかに私のコードでは設定されていません)。
DesiredSizeは、通常、Mesasureの通過後に設定され、ActualWidth/Heightは、コントロールが配置/レンダリング(?)された後に設定されます。その音で、Measure(double.PositiveInfinity、doublePositiveInfinity)を呼び出す必要があります。結局のところ、Draw *がMeasure/Arrangeレイアウトのパラダイムに収まるとは思わない。 –