我正在使用WPF组件中的PreviewKeyDown事件捕获关键命中。我需要区分键入的字符:字母与数字与下划线与其他任何内容。
字母和数字工作正常(只需将KeyEventArgs对象的Key属性转换为字符串并使用该字符串的字符0),但这不适用于下划线。
ToString值取决于本地化键盘设置(在EN / US键盘上显示为“OemMinus”,在CZ / QWERTY键盘上显示为“OemQuestion”)。
那么,如果在PreviewKeyDown事件中键入的字符串是下划线,我怎样才能可靠地找到它?
感谢您的帮助
答案 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)上 - 最好为所有可用事件编码。
祝你的项目好运!