WPF Datagrid зависает при прокрутке вверх, удерживая клавишу со стрелкой - PullRequest
0 голосов
/ 11 января 2019

У меня есть пользовательский элемент управления 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 по какой-то причине определять фокус. Решение пока что приемлемо, но все равно хотелось бы услышать, если кто-нибудь знает, почему прокрутка с помощью клавиш со стрелками в описанном выше случае выполняется так медленно.

...