[英]Converting a List of Enums into Flags in C#
我目前正在使用將一組Key
和ModifierKey
枚舉作為標志的熱鍵包。
例如,這將注冊Ctrl+Shift+4
熱鍵:
hotKey = new GlobalHotKey.HotKey(Key.D4, ModifierKeys.Shift | ModifierKeys.Control);
根據我的理解,當將枚舉作為標志傳遞時,它實際上只是在執行按位or
運算(因此具有語法)。
對於我的UI,我需要將按鍵存儲在List<Key>
。 但是,最終我需要將按下的鍵設置為新的熱鍵,並且需要將List<Key>
轉換為普通的舊Key
(使用標志操作)。
因為我認為這只是一個按位or
操作,我嘗試使用LINQ這一解決方案。
hotkeysPressedBitwise = hotkeysPressed.Select(f => f).Aggregate((x, y) => x | y);
其中hotkeysPressed
是我的List<Key>
。 我的LINQ語句可以正常工作,但是,當實際上將其傳遞到我的函數中時,它並沒有達到預期的效果。
例如,當我傳入X
和C
,我的LINQ語句返回的值等於X | C
X | C
如果我將其強制轉換為Key
枚舉,出於某種原因,它將為我提供F22
鍵。
hotKey = new GlobalHotKey.HotKey( keys , ModifierKeys.None);
不起作用。 (出於相似性考慮,我現在將ModifierKeys設置為none)。
我在這里想念什么嗎?
假設您引用的是System.Windows.Forms.Keys枚舉。
如果您在MSDN文檔中查看Keys枚舉 ,則會看到以下警告:
不要將此枚舉中的值用於按位組合操作。 枚舉中的值不是互斥的。
據我所知,可以與其他值組合的Keys枚舉的唯一值是Shift , Ctrl和Alt 。
請參閱枚舉摘錄:
[Flags]
[TypeConverter(typeof(KeysConverter))]
public enum Keys
{
...
A = 65,
B = 66,
C = 67,
...
Shift = 65536,
Control = 131072,
Alt = 262144
}
與可以組合的修飾鍵(例如,控制鍵,Shift鍵和alt鍵)相反,熱鍵通常不設計為允許多個常規鍵(例如字母X和C)組合使用。
因此,當對常規鍵使用按位運算時, Key
枚舉通常無法以可預測的方式工作,因為它們將被分配順序值,而修飾鍵的值將為2的冪
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.