当前位置:  开发笔记 > 编程语言 > 正文

将WPF Listview滚动到特定行

如何解决《将WPFListview滚动到特定行》经验,为你挑选了3个好方法。

WPF,类似浏览器的应用.
我有一个包含ListView的页面.在调用PageFunction后,我向ListView添加一行,并希望将新行滚动到视图中:

  ListViewItem item = ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem;
  if (item != null)
    ScrollIntoView(item);

这有效.只要新线在视图中,线就会得到它应该的焦点.

问题是,当线条不可见时,事情不起作用.
如果该行不可见,则生成的行没有ListViewItem,因此ItemContainerGenerator.ContainerFromIndex返回null.

但如果没有该项目,如何将该行滚动到视图中?有没有办法滚动到最后一行(或任何地方)而不需要ListViewItem?



1> Sam..:

有人告诉我一个更好的方法滚动到一个特定的线,这很容易,就像魅力一样.
简而言之:

public void ScrollToLastItem()
{
  lv.SelectedItem = lv.Items.GetItemAt(rows.Count - 1);
  lv.ScrollIntoView(lv.SelectedItem);
  ListViewItem item = lv.ItemContainerGenerator.ContainerFromItem(lv.SelectedItem) as ListViewItem;
  item.Focus();
}

MSDN论坛中的较长版本:



2> EFrank..:

我认为这里的问题是如果该行不可见,则尚未创建ListViewItem.WPF按需创建Visible.

所以在这种情况下你可能会得到null这个项目,对吗?(根据你的评论,你这样做)

我在MSDN论坛上发现了一个链接,建议直接访问Scrollviewer以便滚动.对我来说,那里提出的解决方案看起来非常像黑客,但你可以自己决定.

以下是上述链接的代码段:

VirtualizingStackPanel vsp =  
  (VirtualizingStackPanel)typeof(ItemsControl).InvokeMember("_itemsHost",
   BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic, null, 
   _listView, null);

double scrollHeight = vsp.ScrollOwner.ScrollableHeight;

// itemIndex_ is index of the item which we want to show in the middle of the view
double offset = scrollHeight * itemIndex_ / _listView.Items.Count;

vsp.SetVerticalOffset(offset);



3> Joseph jun. ..:

我对Sam的回答做了一些修改.请注意,我想滚动到最后一行.不幸的是,ListView的某些内容只是显示了最后一行(即使它上面有例如100行),所以这就是我修复它的方法:

    public void ScrollToLastItem()
    {
        if (_mainViewModel.DisplayedList.Count > 0)
        {
            var listView = myListView;
            listView.SelectedItem = listView.Items.GetItemAt(_mainViewModel.DisplayedList.Count - 1);
            listView.ScrollIntoView(listView.Items[0]);
            listView.ScrollIntoView(listView.SelectedItem);
            //item.Focus();
        }
    }

干杯

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有