【问题标题】:WPF, PreviewKeyDown event and underscore charWPF、PreviewKeyDown 事件和下划线字符
【发布时间】:2010-05-27 21:05:56
【问题描述】:

我在我的 WPF 组件中使用 PreviewKeyDown 事件来捕捉键命中。我需要区分输入的字符:字母、数字、下划线和其他任何字符。

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

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

那么我怎样才能可靠地找出在 PreviewKeyDown 事件中键入的字符是否是下划线?

感谢您的帮助

【问题讨论】:

    标签: c# wpf


    【解决方案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;
         }
      }
    

    我会补充一定有更好的方法。

    【讨论】:

    • 问题是我还需要检测 Esc、Return 和 Shift 键,它们不适用于 TextInput :( 必须有一种方法可以将 Key 转换为正在输入的字符 :(
    【解决方案2】:

    最后,我不得不重写整个东西(并基于正在输入的文本区域的文本),

    【讨论】:

      【解决方案3】:

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

      就您的问题而言,我不能 100% 确定您要做什么(这对电子游戏等没有帮助),但也许 UIElement.PreviewTextInput event 可以提供帮助 - 而不是必须捕捉单个按键,才能获得实际的文本输入,这在处理语音识别等其他情况时会有所帮助。

      从您的 cmets 看来,您正在尝试捕获非字符指示符和字符指示符;这些可能会相互冲突(尤其是在压缩键盘上),因此似乎 MS 以一种不会意外忽略情况的方式构建了框架。 (您的特殊情况显示了两个不同键盘上 Shift+dash 和 Shift+? 之间的区别;我敢肯定还有更多。)我建议您只寻找按键,并让您的应用程序的最终用户能够修改按键绑定。

      提醒我,小心“MouseDown”事件,因为它们不会发生在触控表面(例如 Microsoft Surface)上 - 最好为所有可用事件编写代码。

      祝你的项目好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-07
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        相关资源
        最近更新 更多