我正在尝试创建一个自定义布局容器,具有与 StackPanel 相同的特性,但它从屏幕右边缘开始布局项目。不用说它不能正常工作。
我在 ArrangeOverride() 中发现了一个缺陷,其中行
Point elementOrigin = new Point(this.DesiredSize.Width, 0);
只需创建一个点@ 0, 0。换句话说,this.DesiredSize.Width = 0。我知道测量步骤发生在安排步骤之前,所以我希望这个控件将设置 DesiredSize 属性。否则我怎么能从屏幕右侧开始渲染?甚至可能吗?
其次,传递给函数的finalSize参数比我在测试 xaml 中定义的三个按钮所需的区域大得多。大约 1676 x 909 与所需的 250 x 60 左右。谢谢你。
这是我的代码:
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);
}