Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从KeyEventArgs筛选控件键_C#_Wpf - Fatal编程技术网

C# 从KeyEventArgs筛选控件键

C# 从KeyEventArgs筛选控件键,c#,wpf,C#,Wpf,我有一个小事件处理程序来处理用户按下或条形码扫描仪发送的所有键: 变量\u textRead应收集所有按下的字符。我只对产生可打印输出的键感兴趣(a-z、0-9、!“§$%等)。如果用户按下例如Ctrl键,则会将字符串LeftCtrl添加到\u textRead,因此我想跳过此键 如何优雅地筛选出Ctrl、Shift、Alt等控制键? 我知道我可以用很多条件语句来实现这一点(如果e.Key==Key.Ctrl),但我希望找到更好的方法。试试这个: using System; using Sy

我有一个小事件处理程序来处理用户按下或条形码扫描仪发送的所有键:


变量
\u textRead
应收集所有按下的字符。我只对产生可打印输出的键感兴趣(a-z、0-9、!“§$%等)。如果用户按下例如Ctrl键,则会将字符串LeftCtrl添加到
\u textRead
,因此我想跳过此键

如何优雅地筛选出Ctrl、Shift、Alt等控制键?

我知道我可以用很多条件语句来实现这一点(
如果e.Key==Key.Ctrl),但我希望找到更好的方法。

试试这个:

using System;
using System.Text; 
using System.Windows.Input;

public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)   
{  
    string keyPressed = _keyConv.ConvertToString(e.Key);

    if (keyPressed != null && keyPressed.Length == 1) 
    {
        if (char.IsLetterOrDigit(keyPressed[0]))
        {
            _textRead.Append(keyPressed[0]);
        }
    }
}

private StringBuilder _textRead = new StringBuilder();   
private KeyConverter _keyConv = new KeyConverter();

我在KeyEventArgs筛选中偶然发现了这个问题。因为这个问题是粗体的,所以我想为这个问题添加答案

过滤掉修饰符

public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)  {
        var pressedModifiers = e.KeyboardDevice.Modifiers;
        if (pressedModifiers != ModifierKeys.None) return;

        //do your stuff
}
public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)  {
        List<Key> ExitKeys = new List<Key> { Key.LeftCtrl, Key.RightCtrl, Key.LeftAlt, Key.RightAlt, Key.LeftShift, Key.RightShift };
        if (ExitKeys.contains(e.Key)) return;

        //do your stuff
}
这将过滤掉组合,例如Ctrl+a

过滤掉特定的修饰符

public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)  {
        var pressedModifiers = e.KeyboardDevice.Modifiers;
        if (pressedModifiers != ModifierKeys.None) return;

        //do your stuff
}
public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)  {
        List<Key> ExitKeys = new List<Key> { Key.LeftCtrl, Key.RightCtrl, Key.LeftAlt, Key.RightAlt, Key.LeftShift, Key.RightShift };
        if (ExitKeys.contains(e.Key)) return;

        //do your stuff
}
public void keydowsink(对象发送方,System.Windows.Input.KeyEventArgs e){
List ExitKeys=新列表{Key.LeftCtrl,Key.RightCtrl,Key.LeftAlt,Key.RightAlt,Key.LeftShift,Key.RightShift};
if(ExitKeys.contains(e.Key))返回;
//做你的事
}

您是否可以不将其检查为
char.IsNumber
char.isleter
只需将密钥转换为char,并且只允许两个conditions@V4Vendetta:但是如何将
枚举转换为
字符
?刚刚检查了更多关于这方面的答案。这变得复杂了,我想我还是坚持你的解决方案离子。