WPF,PreviewKeyDown事件和下划线char

时间:2010-05-27 21:05:57

标签: c# wpf

我正在使用WPF组件中的PreviewKeyDown事件捕获关键命中。我需要区分键入的字符:字母与数字与下划线与其他任何内容。

字母和数字工作正常(只需将KeyEventArgs对象的Key属性转换为字符串并使用该字符串的字符0),但这不适用于下划线。

ToString值取决于本地化键盘设置(在EN / US键盘上显示为“OemMinus”,在CZ / QWERTY键盘上显示为“OemQuestion”)。

那么,如果在PreviewKeyDown事件中键入的字符串是下划线,我怎样才能可靠地找到它?

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

更新:

这有点乱,但在重构之后它可能对你有所帮助。 我使用预览事件捕获文本并强制发送我想要的密钥;我忽略了预览处理程序中的所有其他键。我确实从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 :(得分:1)

最后,我不得不重写整个事情(并将其基于正在键入的textarea的文本),

答案 2 :(得分:0)

ToString值作为那些不同的键返回,因为它获取了Key的名称,而不一定是您想要测试的字符值。我真的建议在那里使用Key枚举......

就你的问题而言,我并不是100%肯定你要做的事情(这在视频游戏等方面没有帮助),但也许UIElement.PreviewTextInput event可能有所帮助 - 您不需要按下单独的按键,而是获得实际的文本输入,这有助于其他情况,例如处理语音识别等时。

从您的评论中可以看出,您正试图捕捉非角色指标和角色指标;这些可能会相互冲突(特别是在压缩键盘上),因此MS似乎以这样的方式构建了框架,以至于不会意外地忽略这种情况。 (你的特殊情况显示了Shift + dash和Shift +?在两个不同的键盘上的区别;我确定还有更多。)我建议只寻找按键并让应用程序的最终用户能够重做键绑定。

这提醒我,请注意“MouseDown”事件,因为它们不会出现在触摸表面(例如Microsoft Surface)上 - 最好为所有可用事件编码。

祝你的项目好运!