在C#中将枚举列表转换为标志

时间:2016-07-20 03:58:41

标签: c# enums

我目前正在使用一个热键包,它将一组KeyModifierKey枚举作为标记。

例如,这将注册Ctrl+Shift+4热键:

hotKey = new GlobalHotKey.HotKey(Key.D4, ModifierKeys.Shift | ModifierKeys.Control);

根据我的理解,当将枚举作为标志传递时,它实际上只是执行按位or操作(因此语法)。

对于我的用户界面,我需要将密钥存储在List<Key>中。但是,我最终需要将按下的键设置为新的热键,我需要将List<Key>转换为普通的Key(使用标志操作)。

因为我认为这只是一个按位or操作,所以我尝试用LINQ解决这个问题。

hotkeysPressedBitwise = hotkeysPressed.Select(f => f).Aggregate((x, y) => x | y);

其中hotkeysPressed是我的List<Key>。我的LINQ语句正常工作,然而,当它实际传递给我的函数时它并没有给我所需的效果。

例如,当我传入XC时,我的LINQ语句返回的值等于X | C。如果我将其转换为Key枚举,则由于某种原因它会给我F22密钥。

hotKey = new GlobalHotKey.HotKey( keys , ModifierKeys.None);不起作用。 (我现在将ModifierKeys设置为无类似物)。

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:3)

假设您引用了System.Windows.Forms.Keys enum。

如果您查看Keys enum的MSDN文档,则会看到以下警告:

  

不要将此枚举中的值用于按位组合   操作。枚举中的值不是互斥的。

据我所知,可以与其他值组合的Keys枚举的唯一值是 Shift Ctrl Alt

请参阅枚举的摘录:

[Flags]
[TypeConverter(typeof(KeysConverter))]
public enum Keys
{
    ...
    A = 65,
    B = 66,
    C = 67,
    ...
    Shift = 65536,
    Control = 131072,
    Alt = 262144
}

答案 1 :(得分:1)

修饰符键(例如修饰符键相比,热键通常不会设计为允许多个常规键(例如字母X和C)组合使用as control,shift,alt)可以合并。

正因为如此,Key枚举通常在常规键上使用按位运算时以可预测的方式工作,因为它们将被赋予顺序值,而修饰键将具有作为幂的值 - 的二

相关问题
最新问题