检测 ListView 中 ListViewItem 的位置

Detect position of a ListViewItem in ListView

我有一个在其中呈现 UserControl 的 ListView 控件。我想知道当前视图中显示了哪些项目,即当前视图中向用户显示的所有内容。

举个例子:

        _______________
        |             |
|1| |2| | |3| |4| |5| | |6| |7|
        |_____________|

在这里我想知道 3、4 和 5 呈现给用户,而 1、2、6 和 7 在可见区域之外。

如何做到这一点?

Juts 将 ScrollViewer CanContentScroll 的附加 属性 设置为 ListView 中的 True,以确保 ScrollViewer根据物理单位而不是逻辑单位滚动(例如 ListView ViewPort 中没有显示一半的项目),然后每次处理 ScrollChanged 事件以获取单位偏移量:

 <ListView ScrollViewer.CanContentScroll="True" x:Name="Lv" ScrollViewer.ScrollChanged="Lv_OnScrollChanged" Height="100">

        <ListBoxItem Height="50"
                Content="Item 1" />
        <ListBoxItem Height="50"
                Content="Item 2" />
        <ListBoxItem Height="50"
                Content="Item 3" />
        <ListBoxItem Height="50"
                Content="Item 4" />
        <ListBoxItem Height="50"
                Content="Item 5" />
        <ListBoxItem Height="50"
                Content="Item 6" />
        <ListBoxItem Height="50"
                Content="Item 7" />

    </ListView>

确保 ListView 高度(或宽度,如果你想使用水平 ListView )必须是 ListViewItem 高度的乘数(*100=x*50 以上,x ∈ ℕ*) .

可见的ListViewItems是从事件处理程序中的VerticalOffset推导出来的:

private void Lv_OnScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        var verticalOffet=e.VerticalOffset;
        //the visible items are the items number from verticalOffet until verticalOffet+(ListView Heigh/ListViewItem Height) 
    }

例如,如果事件被触发且 verticalOffet 为 2,则 ListView ViewPort 中的可见项目为项目 3 和项目 4。