DataGrid ScrollIntoView-如何滚动到未显示的第一行

本文关键字:显示 一行 ScrollIntoView- 何滚动 滚动 DataGrid | 更新日期: 2023-09-27 18:27:24

我正试图向下滚动带有代码的WPF数据网格。我使用

int itemNum=0;
private void Down_Click(object sender, RoutedEventArgs e)
{
    if (itemNum + 1 > dataGridView.Items.Count - 1) return;
    itemNum += 1;
    dataGridView.UpdateLayout();
    dataGridView.ScrollIntoView(dataGridView.Items[itemNum]);
}

仅当当前未显示itemNum行时,此选项才会向下滚动。

例如,如果DataGrid足够长,可以容纳10行,而我有20行,我需要调用此函数11次(直到itemNum为11)才能滚动到下一行。

如果行已经适合网格(即使是屏幕上的最后一行),它也不会向下滚动。

我想实现的是,当我调用这个方法时,网格将把下一行带到网格的顶部(就像滚动器一样)。为什么它不起作用?

DataGrid ScrollIntoView-如何滚动到未显示的第一行

使用DataGridView.FirstDisplayedScrollingRowIndex。

 int itemNum=0;
    private void Down_Click(object sender, RoutedEventArgs e)
    {
        itemNum++;
        if (itemNum > dataGridView.Items.Count - 1) return;
        //dataGridView.UpdateLayout();  <-- I don't think you need this
        dataGridView.FirstDisplayedScrollingRowIndex = itemNum;
    }

很抱歉没有意识到WPF网格没有这个。关于滚动的观点仍然有效。

ScrollIntoView只有在项目不在视图中时才会滚动,如果项目在当前可见行下方,则会使其成为最后一行,因此当您滚动查看第11个项目时,它看起来像是滚动到了第二个。

这种变通办法应该对你有效。你滚动到最底部的一行,然后向上滚动到你需要的任何一行。注意,在这里,您实际上需要更新布局,否则在再次向上滚动之前,它将忽略第一次滚动的结果。

        dataGridView.ScrollIntoView(DataGrid1.Items[DataGrid1.Items.Count - 1]);
        dataGridView.UpdateLayout();
        dataGridView.ScrollIntoView(DataGrid1.Items[itemIndex]);

看看这个,它适用于ListBox,但洞察力很好,也可能适用于网格:

简而言之:这些项是异步加载到ListBox中的,因此如果您在CollectionChanged事件(或类似事件)中调用ScrollIntoView(),它将不会有任何项,因此不会滚动。

希望它能帮助我,它确实帮助了我!;-)