Переопределение поведения ключа по умолчанию в TextBox - PullRequest
3 голосов
/ 21 января 2010

Я только что реализовал функцию быстрого автозаполнения в TextBox, которая вытягивает строку из довольно небольшого списка и «дополняет» слово. Каретка TextBox остается в том месте, где она находилась после последнего нажатия клавиши, и часть слова, которую пользователь еще не набрал, становится подсвеченной, так что начало ввода чего-то другого удалит этот раздел ввода.

Важно то, что мне нужно, чтобы после завершения и выделения частей клавиша пробела работала как клавиша «принять» - например, она перемещала бы курсор в конец законченного слова. Однако, что бы я ни делал, удар пробелом удаляет выделенную часть слова (заменяя ее пробелом, как если бы вы нажимали любую другую клавишу).

Я пробовал это:

private void textBoxIncidentLogTypes_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Space)
    {
        textBoxIncidentLogTypes.CaretIndex = textBoxIncidentLogTypes.Text.Length;
    }
}

Но хотя это «работает», оно срабатывает после , пробел уничтожил лучшую часть фразы. Есть ли способ зафиксировать нажатие до того, как оно будет напечатано в TextBox?

Ответы [ 2 ]

2 голосов
/ 21 января 2010

Попробуйте вместо этого обработать событие PreviewKeyDown ; это должно произойти до того, как TextBox сможет обработать ключ.

В зависимости от того, хотите ли вы, чтобы TextBox также обрабатывал клавишу пробела или нет (т. Е. Вставляете пробел после перемещения каретки), вы можете установить e.Handled в PreviewKeyDown либо на true (не делать больше обработки) или false (пусть TextBox также обрабатывает клавишу пробела).

1 голос
/ 21 января 2010

Попробуйте событие PreviewKeyDown вместо события KeyDown и установите для свойства KeyEventArgs e.Handled значение true!

private void textBoxIncidentLogTypes_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Space)
    {
        textBoxIncidentLogTypes.CaretIndex = textBoxIncidentLogTypes.Text.Length;
        e.Handled = true;
    }
}
...