WPF ListView:自定义滚动行为

时间:2010-11-22 16:43:51

标签: wpf listview gridview .net-4.0 wpf-controls

有没有办法让ListView保持垂直滚动,因为数据是通过绑定到ListView的ItemsSource属性来更新的?我似乎无法在ListView或其底层GridView控件中找到属性来实现所需的结果。我希望它滚动,以便用户始终可以看到最新信息。当行添加到控件但未显示最新的行时,滚动条已经显示。

我应该考虑使用具有自动滚动功能的其他类型的控件吗?我只有两列:一列包含DateTimes,另一列包含一个简单的字符串。我开始认为我的控制选择可能太有限了。

我的XAML看起来大致如下:

<ListView ItemsSource="{Binding Updates}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Timestamp" DisplayMemberBinding="{Binding TimeStamp}"/>
            <GridViewColumn DisplayMemberBinding="{Binding UpdateString}" />
        </GridView>
    </ListView.View>
</ListView>

4 个答案:

答案 0 :(得分:2)

我发现要公开ListView的ScrollViewer对象来操纵滚动。我的DataContext包含一个派生自ObservableCollection的集合,后面的代码中我将一个事件处理程序连接到CollectionChanged事件。我使用Decorator来展示ListView(边框)的第一个孩子,它的孩子是ScrollViewer。从那里我调用ScrollToBottom()方法来达到理想的行为。

在包含ListView的视图背后的代码中,这就是它的编码方式

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上公开ScrollViewer

修改 以前,我正在检查是否满足自定义集合中的最大项目数,然后滚动到底部。对于不同的屏幕分辨率,这不能很好地工作,因为应用程序可能在一台机器上的ListView中显示15行,而在另一台机器上显示25行。所以现在我总是将它滚动到底部以显示最新项目。

答案 1 :(得分:1)

你应该使用一个scrollviewer对象,它会在需要时自动滚动它的内容(你也可以指定你是否总是想要水平或垂直滚动​​,无论它是否需要,以及其他一些东西)

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

MSDN

的更多信息

答案 2 :(得分:0)

我非常确定VirtualizingStackPanel正在被使用......这意味着这些项目在需要之前不存在。因此,如果您有15000个项目,那么在需要之前渲染这15000个项目是没有意义的。

更简单的方法可能是强制排序,以便最新数据保持在顶部。然后它会给你推送项目的外观,但它们将是最旧的项目,因此滚动查看它们无关紧要,除非用户启动它。

答案 3 :(得分:0)

Listview有一个名为ScrollIntoView(object item)的方法。

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

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

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