2010-05-27 3 views
2

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

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

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

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

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

ответ

1

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

0

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

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

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

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

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

1

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> 

Code-за детектирует и процессы _

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

Проблемы в том, мне нужно обнаружить также Esc, Return и переключение клавиш, которые не будет работать с TextInput :( Должен быть способ преобразования ключа в символ, который набирается :( –

Смежные вопросы