按住箭头键向上滚动时,WPF Datagrid会冻结

时间:2019-01-11 20:24:27

标签: c# wpf wpfdatagrid

我有一个基于DataGrid的自定义WPF控件。问题是,当我选择一行并按住向上箭头滚动时,它会按预期工作约5行,然后挂一秒钟,跳到第一个可见行并停留在该行,甚至拒绝向上滚动,甚至如果上面还有更多行要显示。然后,我可以反复按箭头键,每按一次可向上滚动一行,但是按住它直到到达当前显示的行的顶部总是冻结。

一些注意事项:

1)UseRowVirtualization设置为true,而VirtualizationMode设置为Recycling

2)仅当显示大量行时,问题才似乎显现出来。如果可见少于18个左右的行,则按预期,按住向上/向下箭头进行滚动可顺利进行。随着可见行数的增加,滚动会变慢,直到在可见约28行时最终出现冻结问题。

3)我目前已定义DataGridCell的样式,以便FocusableIsTabStop都设置为False。如果我同时做这两个True,则按预期的那样,按住箭头键进行的滚动将快速而流畅。我不希望单个单元格变得可聚焦。我正在对此进行调试,这是我公司产品的UI重新设计的一部分,并且DataGridRowDataGrid中最小的可聚焦单元,目前已确定是行为。

4)在应用程序中的一些地方,我们使用普通DataGrid代替了DataGrid之上的自定义控件。在这些地方,滚动正常,并且没有出现冻结问题,这使我相信该问题位于与自定义控件关联的xaml.cs文件中。

5)定制控件具有用于DataGridRow.KeyDownDataGridRow.GotKeyboardFocus事件的处理程序。一次按下向上箭头,我得到一个KeyDown事件,然后是一个GotKeyboardFocus事件。一旦焦点所在的行到达网格的顶部并冻结,我只会得到KeyDown事件。想知道是否有某种事情会阻止虚拟化以某种方式正常工作,以便一旦到达网格顶部,就没有下一行可以关注。

更新:可以通过在DataGridRow上的PreviewKeyDown处理程序中处理选择和焦点来解决该问题,这似乎比让WPF由于某种原因确定焦点要快。该解决方案目前尚可通过,但仍想听听是否有人知道在上述情况下为何使用箭头键滚动是如此之慢。

0 个答案:

没有答案