【发布时间】:2014-01-15 09:49:11
【问题描述】:
将相同高度的 UIElement 列表添加到 WrapPanel,XAML 为
<Grid>
<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView >
</Grid>
运行时是这样的
为了得到第一行的项目数,我尝试计算每个项目左上角的坐标(相对于列表视图),通过比较每个项目与第一个项目的垂直偏移量,我可以得到第一行的项目数。
但如果项目的高度不同,代码很容易中断。
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++;
}
}
这样做的正确方法是什么?
【问题讨论】:
-
帖子中的截图是link,抱歉我在编辑帖子时遇到了问题...
-
如果项目不是 UIElements,代码当然会失败。你至少应该使用
ListView.ItemContainerGenerator.ContainerFromItem。 -
为什么不检查当前项位置的X值是否小于或等于前一项。这将表明发生了换行。
-
@Clemens 是的!这很明显,检查 X 值,太棒了!但我从来没想过,我一直在寻找像 WrapPanel.Row 这样的神奇附加属性,它可以给我答案。
-
@Clemens 您能否将其发布为答案以便我接受?谢谢