代码之家  ›  专栏  ›  技术社区  ›  Jeff LaFay

WPF ListView:自定义滚动行为

  •  1
  • Jeff LaFay  · 技术社区  · 15 年前

    当数据通过绑定到ListView的ItemsSource属性进行更新时,是否有方法保持ListView垂直滚动?我似乎无法在ListView或其基础GridView控件中找到属性以获得所需的结果。我希望它滚动,以便用户始终可以看到最新的信息。当行添加到控件时,滚动条已显示,但当前行不显示。

    我应该考虑使用具有自动滚动功能的不同类型的控件吗?我只有两列:一列包含日期时间,另一列包含简单字符串。我开始觉得我的控制选择可能太有限了。

    我的XAML大致如下:

    <ListView ItemsSource="{Binding Updates}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Timestamp" DisplayMemberBinding="{Binding TimeStamp}"/>
                <GridViewColumn DisplayMemberBinding="{Binding UpdateString}" />
            </GridView>
        </ListView.View>
    </ListView>
    
    4 回复  |  直到 15 年前
        1
  •  2
  •   Jeff LaFay    15 年前

    我发现暴露了 ListView 的ScrollViewer对象来操作滚动。我的 DataContext 包含派生自的集合 ObservableCollection 在后面的代码中,我将一个eventhandler连接到 CollectionChanged 事件。我用了一个 Decorator 揭露第一个孩子 列表视图 (边界)它的孩子是 ScrollViewer . 从那里我打电话给 ScrollToBottom() 达到预期行为的方法。

    在包含 列表视图 ,这就是它的编码方式

    MyViewModel viewModel = DataContext as MyViewModel;
    
    viewModel.MyCollection.CollectionChanged += (sender,e) =>
    {
        if(e.NewItems != null)
        {
            Decorator border = VisualTreeHelper.GetChild(SummaryListView, 0) as Decorator;
            ScrollViewer scroll = border.Child as ScrollViewer;
            scroll.ScrollToBottom();
        }
    };
    

    我发现了如何暴露 滚动条 在 Anshulee's WindowsClient blog post .

    编辑 以前,我检查是否满足自定义集合中的最大项目数,然后滚动到底部。在不同的屏幕分辨率下效果不太好,因为应用程序可能在 列表视图 在一台机器上,25条线在另一台机器上。所以现在我总是让它滚动到底部,以使最新的项目进入视图。

        2
  •  1
  •   Daniel Perez    15 年前

    您应该使用scrollviewer对象,它将在需要时自动滚动其内容(您还可以指定是否始终需要水平或垂直滚动,无论是否需要,以及其他一些东西)

    <ScrollViewer>
       <GridView>
           <!-- gridview definition -->
       <GridView>
    </ScrollViewer>
    

    更多信息 MSDN

        3
  •  0
  •   Aaron McIver    15 年前

    我敢肯定 VirtualizingStackPanel 正在被使用的封面…这意味着这些项目不存在,直到他们需要。因此,如果有15000个项目,则在需要之前渲染这些15000个项目是没有意义的。

    一种更简单的方法可能是强制排序,以便最新的数据保持在顶部。然后,它会给你一个向下推项目的外观,但他们将是最古老的项目,所以滚动查看它们并不重要,除非用户启动它。

        4
  •  0
  •   Flagbug    15 年前

    Listview有一个名为 ScrollIntoView(object item) .

    这将把Listview滚动到指定项所在的位置。

    当您有一个绑定到Listview的集合时,可以在集合发生更改时调用此方法,例如:

    private void myCollectionChanged()
    {
        myListView.ScrollIntoView(myCollection.Last());
    }