我有一个基于DataGrid的自定义WPF控件。问题是,当我选择一行并按住向上箭头滚动时,它会按预期工作约5行,然后挂一秒钟,跳到第一个可见行并停留在该行,甚至拒绝向上滚动,甚至如果上面还有更多行要显示。然后,我可以反复按箭头键,每按一次可向上滚动一行,但是按住它直到到达当前显示的行的顶部总是冻结。
一些注意事项:
1)UseRowVirtualization
设置为true,而VirtualizationMode
设置为Recycling
2)仅当显示大量行时,问题才似乎显现出来。如果可见少于18个左右的行,则按预期,按住向上/向下箭头进行滚动可顺利进行。随着可见行数的增加,滚动会变慢,直到在可见约28行时最终出现冻结问题。
3)我目前已定义DataGridCell
的样式,以便Focusable
和IsTabStop
都设置为False
。如果我同时做这两个True
,则按预期的那样,按住箭头键进行的滚动将快速而流畅。我不希望单个单元格变得可聚焦。我正在对此进行调试,这是我公司产品的UI重新设计的一部分,并且DataGridRow
是DataGrid
中最小的可聚焦单元,目前已确定是行为。
4)在应用程序中的一些地方,我们使用普通DataGrid
代替了DataGrid
之上的自定义控件。在这些地方,滚动正常,并且没有出现冻结问题,这使我相信该问题位于与自定义控件关联的xaml.cs文件中。
5)定制控件具有用于DataGridRow.KeyDown
和DataGridRow.GotKeyboardFocus
事件的处理程序。一次按下向上箭头,我得到一个KeyDown
事件,然后是一个GotKeyboardFocus
事件。一旦焦点所在的行到达网格的顶部并冻结,我只会得到KeyDown
事件。想知道是否有某种事情会阻止虚拟化以某种方式正常工作,以便一旦到达网格顶部,就没有下一行可以关注。
更新:可以通过在DataGridRow上的PreviewKeyDown处理程序中处理选择和焦点来解决该问题,这似乎比让WPF由于某种原因确定焦点要快。该解决方案目前尚可通过,但仍想听听是否有人知道在上述情况下为何使用箭头键滚动是如此之慢。