如何在WrapPanel的第一行中获取项目数?

时间:2014-01-15 09:49:12

标签: wpf wrappanel

具有相同高度的UIElements列表将添加到WrapPanel,而XAML是

<Grid>
    <ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
    </ListView >
</Grid>

运行时看起来像这样

enter image description here

为了获得第一行的项目计数,我尝试通过比较每个项目的垂直偏移量与第一个项目来计算每个项目左上角的坐标(相对于列表视图),我可以得到第一行的项目计数。

但如果项目的高度不同,代码很容易破解。

ListView listView = (sender as ListView);
if (listView.Items.Count > 0)
{
    UIElement firstItem = ((listView.Items)[0] as UIElement);
    double y = firstItem.TranslatePoint(new Point(0, 0), listView).Y; 

    int counter = 0;
    foreach (UIElement item in listView.Items)
    {
        if ((item.TranslatePoint(new Point(0, 0), listView).Y != y))
        {
            break;
        }
        counter++;
    }
}

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

这种方法应该完成工作:

private static int GetItemsInFirstRow(ItemsControl itemsControl)
{
    double previousX = -1;
    int itemIndex;

    for (itemIndex = 0; itemIndex < itemsControl.Items.Count; itemIndex++)
    {
        var container = (UIElement)itemsControl.ItemContainerGenerator
                                                .ContainerFromIndex(itemIndex);

        var x = container.TranslatePoint(new Point(), itemsControl).X;

        if (x <= previousX)
        {
            break;
        }

        previousX = x;
    }

    return itemIndex;
}