C# 滚动到列表框顶部

12

我看到很多帖子展示了如何滚动到ListBox的底部,但我无法弄清楚如何自动滚动到ListBox的顶部。 如果我向下滚动我的ListBox,然后使用我的筛选函数,ListBox将停留在您滚动到的位置,因此用户可能无法看到在他们滚动到的位置上方的结果。

我一直尝试使用listbox.ScrollIntoView,但是无法得到正确的函数。这是它应该被放置的上下文...(注释部分):

private void filter_Click(object sender, RoutedEventArgs e)
{
    string filterString = textBox1.Text;
    XElement _xml = XElement.Load("1/1.xml");
    {
        results.Items.Clear();
        foreach (XElement value in _xml.Elements("Operators").Elements("Operator"))
        {
            1Item _item = new 1Item();
            _item.TradingName = value.Element("TradingName").Value;

            if (_item.Town.IndexOf(filterString, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
            {
                results.Items.Add(_item);
                // add scroll function here
            }
        }
    } 
}
许多感谢。
3个回答

32
if(results.Items.Count > 0)
    results.ScrollIntoView(results.Items[0]);

谢谢,看起来很准确,但出于某些原因它没有发挥作用。没有错误或任何提示,只是不工作?!奇怪。 - Dan Sewell
你是否在 foreach 循环之外调用了 ScrollIntoView - Bala R
是的。如果我摆脱所有的XML和listbox填充代码,只在方法中加入你的这行代码,它会将列表框返回到顶部,就像它应该做的那样。 - Dan Sewell
好的,我已经将你的代码行放在我的方法的第一行,现在它可以正常工作了。非常感谢! - Dan Sewell
@BalaR 简单而有效的回答。+1 - Vladimir Kocjancic
@BalaR,如果ListBox包含分组,则您的解决方案无法正常工作。它会滚动到第一个项目,但组标题仍然会保持隐藏状态。-1 - Pavels Ahmadulins

3

ScrollIntoView 对我没有起作用,但是这个方法可行:

VisualTreeHelperEx.FindDescendantByType<ScrollViewer>(YourListView)?.ScrollToTop();

这里使用了扩展的WPF工具包来获取ScrollViewer,但你当然也可以手动实现,例如 这个回答

可能是因为你没有调用调度程序,所以它没有起作用。 - undefined

0
一个重要的注意事项是,如果你从另一个线程或组件调用ScrollIntoView方法,你还需要调用调度程序。这是对@Bala-R的回答(以及为什么对@Mr-Bungle有效)的补充。
    public async Task ScrollToTop()
    {
        await this.Dispatcher.BeginInvoke(() => {
            if (lstRecords.Items.Count > 0)
                lstRecords.ScrollIntoView(lstRecords.Items[0]);
        });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接