Переопределить ключ ввода, но сохранить поведение по умолчанию для других ключей в сетке данных wpf - PullRequest
4 голосов
/ 13 апреля 2011

Меня действительно беспокоит, что нажатие клавиши ввода в Datagrid перемещает выделение на один элемент вниз, я хотел бы иметь возможность решить, что он делает в обычном событии нажатия клавиши.

Итак, я создал новый класс, который наследовал DataGrid, переопределил событие OnKeyDown и использовал его в качестве моей таблицы данных.

Это создает совершенно новый набор проблем, поскольку мне, видимо, приходится переписывать все другие нажатия клавиш (навигация по клавишам со стрелками, выбор клавиш Shift + стрелка, pgup / pgdn и т. Д.). Я пытался взломать его, но мне кажется, что бессмысленно тратить время на переписывание того, что уже написано, и, вероятно, лучше, чем я придумаю.

Итак, как я могу заставить клавишу ввода делать то, что я хочу, не мешая другим связям клавиш по умолчанию в сетке данных?

Заранее спасибо

Ответы [ 5 ]

9 голосов
/ 13 апреля 2011

Вам нужно будет связать обработчик PreviewKeyDown с сеткой данных, а затем вручную проверить, является ли значение ключа Key.Enter.

Если да, установите e.Handled = true.

3 голосов
/ 13 апреля 2011

Просто проверьте, нажата ли клавиша ввода, если нет, вызовите базовый обработчик события KeyDown (что-то вроде base.OnKeyDown(sender, args);)

2 голосов
/ 11 марта 2014

Гораздо более простая реализация. Идея состоит в том, чтобы захватить событие нажатия клавиш, и если ключ «Ввод», решить, в каком направлении вы хотите пройти.
FocusNavigationDirection имеет несколько свойств, в зависимости от которых можно изменить фокус.

/// <summary>
/// On Enter Key, it tabs to into next cell.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LiquidityInstrumentViewsGrid_OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    var uiElement = e.OriginalSource as UIElement;
    if (e.Key == Key.Enter && uiElement != null)
    {
        e.Handled = true;
        uiElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    }
}
0 голосов
/ 01 февраля 2016

PreviewKeyDown с Handled = true - это решение bad .Это остановит обработку Key на этапе настройки и никогда не вызовет всплывающее событие.Проще говоря, это сожрет любые нажатия клавиши Enter.Это означало, что верхние панели никогда не получат событие KeyDown (представьте, что ваше окно принимает что-то при ENTER KeyDown ...).

Правильное решение - это то, что предложил Энтони: оставить Handled = false, - так что он продолжает пузыриться - и пропустить обработку Введите внутри DataGrid

public class DataGridWithUnhandledReturn : DataGrid
{
    /// <inheritdoc/>
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.Return && e.KeyboardDevice.Modifiers == ModifierKeys.None)
        {
            return;
        }

        base.OnKeyDown(e);
    }
}
0 голосов
/ 13 апреля 2011

Если он работает примерно так же для winforms, для нажатий клавиш, которые вы не обрабатываете, то пометьте обработанный как ложный, и он будет проходить нажатие клавиши вперед. KeyEventArgs Class

Обработано Получает или задает значение, которое указывает текущее состояние обработки события для перенаправленного события при его прохождении по маршруту.(Унаследовано от RoutedEventArgs.)

...