ArrangeOverride中的FinalSize出错

时间:2016-07-04 12:04:42

标签: wpf custom-controls panel

我正在做一个自定义面板,基于(heriting)WrapPanel。 我这样做是因为我在WrapPanel中使用的一些UserControl不能包装,因为他们能够使用"无限"宽度,因此具有垂直方向的WrapPanel永远不会换行。

我想做一个WrapPanel,当orientation = Vertical时忽略元素的宽度,并且当orientation = Horizo​​ntal时忽略元素的高度。

目前我有以下代码:

protected override Size ArrangeOverride(Size finalSize)
{
    int numberOfColumns, numberOfRows;
    UIElement uiElement = InternalChildren.OfType<UIElement>().First();
    if (Orientation == Orientation.Horizontal)
    {
        double desiredWidth = uiElement.DesiredSize.Width;
        numberOfColumns = (int)Math.Round(finalSize.Width / desiredWidth);
        numberOfRows = (int)Math.Ceiling(InternalChildren.Count / (double)numberOfColumns);
    }
    else
    {
        double desiredHeight = uiElement.DesiredSize.Height;
        numberOfRows = (int)Math.Round(finalSize.Height / desiredHeight);
        numberOfColumns = (int)Math.Ceiling(InternalChildren.Count / (double)numberOfRows);
    }
    int row = 0, column = 0;
    Size elementSize = new Size(Math.Floor(finalSize.Width / numberOfColumns), Math.Floor(finalSize.Height / numberOfRows));
    foreach (UIElement child in InternalChildren)
    {
        child.Arrange(new Rect(new Point(row * elementSize.Width, column * elementSize.Height), elementSize));
        if (Orientation == Orientation.Horizontal)
        {
            column++;
            if (column >= numberOfColumns)
            {
                column = 0;
                row++;
            }
        }
        else
        {
            row++;
            if (row >= numberOfRows)
            {
                row = 0;
                column++;
            }
        }
    }
    return finalSize;
}

问题是我收到的finalSize大于&#34; ActualSize&#34;组件的宽度(实际上宽度2x是actualSize)。

我错过了什么?

0 个答案:

没有答案