c# - 如何获取 ListView 中的起始索引和可见项数?

标签 c# listview

我有一个在虚拟模式下工作的 ListView ,在 LargeIcons View 中。检索很昂贵,所以我想询问所有可见项目的数据。如何获取起始索引和可见项总数?

更新:我知道 CacheVirtualItems 事件。我们使用的第三方数据库检索一条记录需要大约 3 秒,但检索一千条记录需要大约 4 秒,所以我必须以大块的形式进行。我需要确保可见记录在我们检索的记录中,因此我需要知道可见项的起始索引和总数。如果这不可行,我将不得不找到一个解决方法(这可能涉及使用带有大量图像单元格的 DataGridView 来模仿 LargeIcons View ),但如果可能的话我想正确地做到这一点。

最佳答案

真正的答案是:
* 获取ListView的ScrollViewer。
* ScrollViewer.VerticalOffset 是第一个显示项的索引。
* ScrollViewer.ViewportHeight 是显示的项目数。

要获取 ScrollViewer,您需要一个函数, 将搜索的 FindDescendant(FrameworkElement, Type) 在 children 的 列表显示。在加载 Window 后调用它。

VB.Net 和 C# 中的代码:

Public Function FindDescendant(ByVal MyElementToSeek As FrameworkElement, _
                                  ByVal TypeToFind As Type) As FrameworkElement
    If MyElementToSeek Is Nothing Then Return Nothing
    If MyElementToSeek.GetType() = TypeToFind Then Return MyElementToSeek
    For i = 0 To VisualTreeHelper.GetChildrenCount(MyElementToSeek) - 1
        Dim OneChild = TryCast(VisualTreeHelper.GetChild(MyElementToSeek, i), FrameworkElement)
        Dim Result = FindDescendant(OneChild, TypeToFind)
        If Result IsNot Nothing Then Return Result
    Next
    Return Nothing
End Function

.

public FrameworkElement FindDescendant(FrameworkElement MyElementToSeek, 
                                         Type TypeToFind) 
{
    if (MyElementToSeek == null) return null;
    if (MyElementToSeek.GetType() == TypeToFind) return MyElementToSeek;
    for (i = 0; 
               (i<= (VisualTreeHelper.GetChildrenCount(MyElementToSeek) - 1)); i++) 
      {
        object OneChild = TryCast(VisualTreeHelper.GetChild(MyElementToSeek, i),
                                                         FrameworkElement);
        object Result = FindDescendant(OneChild, TypeToFind);
        if (Result) return Result;
        }
     return null;
    }
}

    ' MyScrollViewer = FindDescendant(MyListView, ScrollViewer)

关于c# - 如何获取 ListView 中的起始索引和可见项数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/372011/

相关文章:

javascript - React Native - Listview下拉刷新多次触发

c# - 如何使用 .net core 的 ILoggerFactory 写入自定义事件源?有没有办法指定来源?

c# - 为什么使用MessageQueue存储异常消息?

c# - 如何通过同一 View 模型的属性传递事件

c# - 如何反序列化不同类型的集合?

android - 对 listview 和 listadapter 的工作原理感到困惑

java - listview.setOnItemClickListener 不起作用

c# - 数字组合

java - 将 JavaFx ListView 的选择索引绑定(bind)到整数属性

android listview复选框事件