У меня есть пользовательский элемент управления WPF на основе DataGrid. Проблема в том, что когда я выбираю строку и удерживаю стрелку вверх для прокрутки, она работает, как и ожидалось, примерно для 5 строк, затем зависает на секунду, переходит к первой видимой строке и остается там, отказываясь прокручивать дальше, даже если есть еще строки для отображения выше. Затем я могу несколько раз нажать клавишу со стрелкой, чтобы прокрутить одну строку вверх при каждом нажатии, но удержание ее всегда останавливается, когда она достигает верхней части отображаемых в данный момент строк.
Несколько заметок:
1) UseRowVirtualization
установлено на true, а VirtualizationMode
установлено на Recycling
2) Проблема проявляется только тогда, когда отображается большое количество строк. Если видно менее 18 строк, удерживание стрелок вверх / вниз для прокрутки работает плавно, как и ожидалось. По мере увеличения количества видимых строк прокрутка замедляется до тех пор, пока в конечном итоге не возникнет проблема зависания, когда ~ 28 строк видны.
3) В настоящее время стиль для DataGridCell
определен так, что Focusable
и IsTabStop
установлены на False
. Если я сделаю оба этих True
, прокрутка с помощью клавиш со стрелками будет быстрой и плавной, как и ожидалось. Я не хочу, чтобы отдельные клетки были фокусируемыми. Я отлаживаю это как часть редизайна пользовательского интерфейса для продукта моей компании, и DataGridRow
, являющийся наименьшей фокусируемой единицей из DataGrid
, является установленным поведением на данный момент.
4) В приложении есть несколько мест, где мы используем ваниль DataGrid
вместо пользовательского элемента управления поверх DataGrid
. В этих местах прокрутка работает нормально, а проблема с замораживанием не проявляется, поэтому я полагаю, что проблема где-то в файле xaml.cs, связанном с пользовательским элементом управления.
5) У пользовательского элемента управления есть обработчики для событий DataGridRow.KeyDown
и DataGridRow.GotKeyboardFocus
. Когда я нажимаю стрелку вверх один раз, я получаю событие KeyDown
, за которым следует событие GotKeyboardFocus
. Как только сфокусированный ряд достигает вершины сетки и останавливается, я получаю только событие KeyDown
. Интересно, может ли что-то помешать правильной работе виртуализации, чтобы не было следующей строки, на которую можно было бы обратить внимание, как только я достигну вершины сетки.
ОБНОВЛЕНИЕ: удалось обойти это путем обработки выделения и фокусировки в обработчике PreviewKeyDown для DataGridRow, который, кажется, работает быстрее, чем позволяет WPF по какой-то причине определять фокус. Решение пока что приемлемо, но все равно хотелось бы услышать, если кто-нибудь знает, почему прокрутка с помощью клавиш со стрелками в описанном выше случае выполняется так медленно.