0

我正在开发一个Panel与 a 类似的自定义 WPF,Canvas只是它的子元素的位置表示为百分比而不是绝对偏移量。Panel我正在调用的PercentageCanvas将像这样使用:

<Window>
  <local:PercentageCanvas>
    <ChildElement local:PercentageCanvas.Left=".30" local:PercentageCanvas.Top=".50" />
    <ChildElement local:PercentageCanvas.Left="0" local:PercentageCanvas.Top=".9" />
      ... etc ...
  </local:PercentageCanvas>
</Window>

我有PercentageCanvas工作,虽然不像我预期的那样。PercentageCanvas正如我所预料的那样,子元素的位置相对于子元素的中心而不是左上角。这是ArrangeOverride我使用的给我这种行为的方法:

protected override Size ArrangeOverride(Size finalSize)
{
    int currentIndex = 0;

    for (int index = InternalChildren.Count - 1; index >= 0; index--)
    {
        Rect rect = new Rect(finalSize);

        rect.Location = new Point()
        {
            X = finalSize.Width * PercentagePanel.GetLeft(InternalChildren[index]) - finalSize.Width / 2,
            Y = finalSize.Height * PercentagePanel.GetTop(InternalChildren[index]) - finalSize.Height / 2
        };

        InternalChildren[index].Arrange(rect);
        currentIndex++;
    }

    return finalSize;
}

似乎为了抵消这种中心定位行为,我需要知道每个孩子的尺寸并在Location计算Rect. 但是,我似乎无法访问孩子的大小来计算适当的偏移量。

在方法中计算子级布局时,如何考虑面板子级的大小ArrangeOverride

4

1 回答 1

1

在写问题的过程中找到了答案。所有人UIElements都有一个DesiredSize属性,它给了我我正在寻找的东西。我的ArrangeOverride方法现在看起来像这样(您必须向右滚动才能看到差异):

protected override Size ArrangeOverride(Size finalSize)
{
    int currentIndex = 0;

    for (int index = InternalChildren.Count - 1; index >= 0; index--)
    {
        Rect rect = new Rect(finalSize);

        rect.Location = new Point()
        {
            X = finalSize.Width * PercentagePanel.GetLeft(InternalChildren[index]) - finalSize.Width / 2 + (InternalChildren[index].DesiredSize.Width / 2),
            Y = finalSize.Height * PercentagePanel.GetTop(InternalChildren[index]) - finalSize.Height / 2 + (InternalChildren[index].DesiredSize.Height / 2)
        };

        InternalChildren[index].Arrange(rect);
        currentIndex++;
    }

    return finalSize;
}

元素现在相对于它们的左上角而不是它们的中心定位它们自己。

于 2014-03-14T23:21:28.580 回答