画面の右端から始まるアイテムをレイアウトすることを除いて、StackPanel と同じ特性を持つカスタム レイアウト コンテナーを作成しようとしています。言うまでもなく、正しく動作しません。
ArrangeOverride() 内に欠陥を特定しました。
Point elementOrigin = new Point(this.DesiredSize.Width, 0);
単にポイント @ 0, 0 を作成します。つまり、this.DesiredSize.Width = 0 です。配置ステップの前に測定ステップが発生することを理解しているので、このコントロールには DesiredSize プロパティが設定されると予想します。それ以外の場合、画面の右側からレンダリングを開始するにはどうすればよいですか? それは可能ですか?
第 2に、関数に渡されるfinalSize引数は、テスト用 xaml で定義した 3 つのボタンに必要な領域よりもはるかに大きいです。必要な 250 x 60 程度に対して、1676 x 909 の調子です。ありがとうございました。
これが私のコードです:
protected override Size MeasureOverride(Size availableSize)
{
Size availableSpace = new Size(double.PositiveInfinity, double.PositiveInfinity);
Size desiredSize = new Size(0, 0);
foreach (UIElement child in this.Children)
{
child.Measure(availableSpace);
desiredSize.Width += child.DesiredSize.Width;
desiredSize.Height = Math.Max(desiredSize.Height, child.DesiredSize.Height);
}
return base.MeasureOverride(desiredSize);
}
protected override Size ArrangeOverride(Size finalSize)
{
Point elementOrigin = new Point(this.DesiredSize.Width, 0);
foreach (UIElement child in this.Children)
{
Rect childBounds = new Rect(elementOrigin, child.DesiredSize);
elementOrigin.X -= child.DesiredSize.Width;
child.Arrange(childBounds);
}
return base.ArrangeOverride(finalSize);
}