簡體   English   中英

在C#中將枚舉列表轉換為標志

[英]Converting a List of Enums into Flags in C#

我目前正在使用將一組KeyModifierKey枚舉作為標志的熱鍵包。

例如,這將注冊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語句可以正常工作,但是,當實際上將其傳遞到我的函數中時,它並沒有達到預期的效果。

例如,當我傳入XC ,我的LINQ語句返回的值等於X | C X | C 如果我將其強制轉換為Key枚舉,出於某種原因,它將為我提供F22鍵。

hotKey = new GlobalHotKey.HotKey( keys , ModifierKeys.None); 不起作用。 (出於相似性考慮,我現在將ModifierKeys設置為none)。

我在這里想念什么嗎?

假設您引用的是System.Windows.Forms.Keys枚舉。

如果您在MSDN文檔中查看Keys枚舉 ,則會看到以下警告:

不要將此枚舉中的值用於按位組合操作。 枚舉中的值不是互斥的。

據我所知,可以與其他值組合的Keys枚舉的唯一值是ShiftCtrlAlt

請參閱枚舉摘錄:

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM