我正在尝试向后滚动一个WPF DataGrid。 我用
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)才能滚动到下一行。< / p>
如果行已经适合网格(即使它是屏幕上的最后一行),它也不会向下滚动。
我想实现这一点,当我调用此方法时,网格将下一行放入网格的顶部(如滚动条所做)。 为什么它不起作用?
答案 0 :(得分:18)
使用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]);
答案 1 :(得分:2)
Check this out,它适用于ListBox,但洞察力很强,它也适用于网格:
简而言之:这些项目是异步加载到ListBox中的,所以如果你在CollectionChanged事件(或类似的)中调用ScrollIntoView(),它将没有任何项目,所以没有滚动。
希望它有所帮助,它肯定对我有帮助! ; - )