代码之家  ›  专栏  ›  技术社区  ›  Matěj Zábský

WPF、PreviewKeyDown事件和下划线字符

  •  2
  • Matěj Zábský  · 技术社区  · 16 年前

    我在wpf组件中使用previewkeydown事件捕获关键点。我需要区分键入的字符:字母、数字、下划线和其他任何字符。

    字母和数字可以正常工作(只需将keyEventArgs对象的key属性转换为string,并使用该字符串的字符0),但这对下划线不起作用。

    它的字符串值取决于本地化的键盘设置(在en/us键盘上显示为“oemminus”,在cz/qwerty键盘上显示为“oemquestion”)。

    那么,如果在previewkeydown事件中键入的char是下划线,我如何才能可靠地查明呢?

    谢谢你的帮助

    3 回复  |  直到 16 年前
        1
  •  1
  •   Zamboni    16 年前

    更新:

    这有点凌乱,但经过一些重构之后可能会有所帮助。 我使用预览事件捕获文本并强制发送所需的键;我忽略预览处理程序中的所有其他键。我确实从键向下切换到键向上,以使预览事件首先触发。我使用\u 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;
         }
      }
    

    我再补充一句,一定有更好的办法。

        2
  •  1
  •   Matěj Zábský    16 年前

    最后,我必须重写整个内容(并基于正在输入的文本区域的文本)。

        3
  •  0
  •   Matt DeKrey Kiran    16 年前

    ToString值作为这些不同的键返回,因为它得到了键的名称,而不一定是要测试的字符值。我真的建议使用这里的密钥枚举…

    就你的问题而言,我不能百分之百确定你想做什么(这对电子游戏等没有帮助),但也许 UIElement.PreviewTextInput event 可以帮助-而不是必须抓住个别按键,你得到实际的文本输入,这有助于在其他情况下,如处理语音识别等。

    从您的评论中可以看出,您试图捕获非字符指标和字符指标;这些指标可能会相互冲突(尤其是在压缩键盘上),因此,MS构建框架的方式似乎不会意外忽略某个情况。(您的特定情况显示shift+dash和shift+之间的区别?在两个不同的键盘上;我敢肯定还有更多。)我建议只查找按键,并赋予应用程序的最终用户重新绑定键的能力。

    这提醒了我,小心“mousedown”事件,因为它们不会出现在触摸屏上(如Microsoft Surface),最好对所有可用事件进行编码。

    祝你的项目好运!