将 ListViewItem 滚动到 ListView 的顶部 [英] Scroll ListViewItem to be at the top of a ListView

查看:27
本文介绍了将 ListViewItem 滚动到 ListView 的顶部的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 WPF 中,我知道我可以使用 ListView.ScrollIntoView 将特定项目滚动到视图中,但它始终会执行最少的滚动,以便显示该项目.

In WPF, I know I can use ListView.ScrollIntoView to scroll a particular item into view, but it will always do the least amount of scrolling so that the item is shown.

如何让它滚动,让我想显示的项目滚动到 ListView 的顶部?

How can I make it scroll so that the item I want to show is scrolled to the top of the ListView?

我想过调用 ScrollIntoView 两次,一次用于我想要在顶部的项目,一次用于最后显示的项目,但我不知道如何找出最后显示的项目.

I've thought about calling ScrollIntoView twice, once for the item I want at the top, and once for the last shown item, but I don't know how to find out what the last shown item.

推荐答案

我们可以通过获取 ScrollViewer 存在于 ListView 的 ControlTemplate 中.如果您有权访问 ScrollViewer,则有很多 暴露了不同的滚动方法.

We can do this by obtaining the ScrollViewer that is present in the ListView's ControlTemplate. If you have access to a ScrollViewer then there are a lot of different scrolling methods exposed.

首先,我们可以创建一个 ListView 来添加这个效果:

First, we can create a ListView that we want to add this effect to:

<ListView ItemsSource="{Binding Percents}"
      SelectionChanged="OnSelectionChanged"
      x:Name="uiListView"/>


public List<int> Percents { get; set; }

public Window1()
{
    InitializeComponent();

    Percents = new List<int>();
    for (int i = 1; i <= 100; i++)
    {
        Percents.Add(i);
    }
    this.DataContext = this;
}

我们还需要一些可以用来从 ListView 获取 ScrollViewer 的东西.我之前使用过类似的东西来处理自定义滚动,我们也可以在这里使用它.

We will also need something that we can use to obtain the ScrollViewer from the ListView. I've used something similar to this before to work with custom scrolling, and we can use it here as well.

public static DependencyObject GetScrollViewer(DependencyObject o)
{
    if (o is ScrollViewer)
    { return o; }

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
    {
        var child = VisualTreeHelper.GetChild(o, i);

        var result = GetScrollViewer(child);
        if (result == null)
        {
            continue;
        }
        else
        {
            return result;
        }
    }

    return null;
}

现在,我们只需要处理 SelectionChanged 事件.因为我们试图将一个项目滚动到列表的顶部,所以最好的选择是滚动到底部,然后重新向上滚动到我们选择的项目.正如您所说,ScrollIntoView 将滚动直到该项目可见,因此一旦所选项目在向上滚动时到达顶部,它将停止将我们选择的项目留在列表的最顶部.

Now, we just need to handle the SelectionChanged event. Because we are trying to scroll an item to the top of the list, the best option is to scroll to the bottom, and then re-scroll up to our selected item. As you said, ScrollIntoView will scroll just until the item is visible, and so once the selected item reaches the top as it scrolls back up, it will cease leaving us with our selected item at the very top of the list.

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
    scrollViewer.ScrollToBottom();

    uiListView.ScrollIntoView(e.AddedItems[0]);
}

这篇关于将 ListViewItem 滚动到 ListView 的顶部的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆