WPF, PreviewKeyDown событие и символ подчеркивания - PullRequest
2 голосов
/ 28 мая 2010

Я ловлю ключевые попадания с помощью события PreviewKeyDown в моем компоненте WPF. Мне нужно различать вводимые символы: буквы против цифр, подчеркивание и все остальное.

Буквы и цифры работают нормально (просто преобразуйте свойство Key объекта KeyEventArgs в строку и работайте с символом 0 этой строки), но это не сработает для подчеркивания.

Значение ToString зависит от локализованных настроек клавиатуры (оно отображается как «OemMinus» на клавиатуре EN / US и «OemQuestion» на клавиатуре CZ / QWERTY).

Итак, как мне НАДЕЖНО выяснить, если набранный символ подчеркивается в событии PreviewKeyDown?

Спасибо за любую помощь

Ответы [ 3 ]

1 голос
/ 28 мая 2010

UPDATE:

Это немного грязно, но может помочь после некоторого рефакторинга. Я фиксирую текст, используя событие предварительного просмотра, и принудительно отправляю ключ, который хочу; Я игнорирую все остальные ключи в моем обработчике предварительного просмотра. Я переключился с KeyDown на KeyUp, чтобы сначала запустить событие предварительного просмотра. Я использую флаг _clearNext, чтобы пропустить / очистить событие ключа.

В XAML

<Window x:Class="EmployeeNavigator.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    PreviewTextInput="Window_PreviewTextInput"
    Keyup="Window_KeyUp"
    Height="400" 
    Width="600"
    MinWidth="600">
</Window>

Кодовый код обнаруживает и обрабатывает _

  private bool _clearNext = false;
  private void Window_KeyUp(object sender, KeyEventArgs e)
  {
     if ( _clearNext )
     {
        _clearNext = false;
        e.Handled = true;
     }
     else if (e.Key == Key.OemMinus)
     {
        e.Handled = true;
     }
     else if (e.Key == Key.OemQuestion)
     {
        e.Handled = true;
     }
  }

  private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
  {
     if (e.Text.Equals("_"))
     {
        KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice,
           Keyboard.PrimaryDevice.ActiveSource, 0, Key.OemMinus);
        args.RoutedEvent = Keyboard.KeyUpEvent;
        InputManager.Current.ProcessInput(args);
        e.Handled = true;
        _clearNext = true;
     }
     else if (e.Text.Equals("?"))
     {
        KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice,
           Keyboard.PrimaryDevice.ActiveSource, 0, Key.OemQuestion);
        args.RoutedEvent = Keyboard.KeyUpEvent;
        InputManager.Current.ProcessInput(args);
        e.Handled = true;
        _clearNext = true;
     }
  }

Я добавлю, что должен быть лучший способ.

1 голос
/ 08 августа 2010

В конце концов, мне пришлось переписать все это (и основать его на тексте текстовой области, в которую вводится текст),

0 голосов
/ 28 мая 2010

Значение ToString возвращается как эти различные ключи, потому что оно получает имя ключа, а не обязательно значение символа, которое вы хотите проверить. Я бы действительно рекомендовал использовать перечисление ключей там ...

Что касается вашего вопроса, я не уверен на 100%, что вы пытаетесь сделать (это не поможет в видеоиграх и т. Д.), Но, возможно, событие UIElement.PreviewTextInput может помочь - вместо того, чтобы отлавливать отдельные нажатия клавиш, вы получаете фактический ввод текста, который помогает в других ситуациях, например при работе с распознаванием голоса и т. д.

Из ваших комментариев видно, что вы пытаетесь захватить как не символьные, так и символьные индикаторы; они могут потенциально конфликтовать друг с другом (особенно на сжатых клавиатурах), поэтому кажется, что MS создала структуру таким образом, что ситуация не была случайно пропущена. (Ваша конкретная ситуация показывает разницу между Shift + тире и Shift +? На двух разных клавиатурах; я уверен, что это еще не все.) Я бы рекомендовал искать только нажатия клавиш и дать возможность конечному пользователю вашего приложения переделать клавишу привязок.

Что напоминает мне, будьте осторожны с событиями "MouseDown", потому что они не будут происходить на сенсорных поверхностях (таких как Microsoft Surface) - лучше всего кодировать для всех доступных событий.

Удачи в вашем проекте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...