2014-11-02 80 views
0

XNA有一個方法,Keyboard.GetState(),它返回鍵盤的狀態。您可以輪詢以查看是否通過枚舉Keys按下了某個特定鍵,該鍵恰好與常規C#使用的「恰巧」相同。我的幫助器方法應該返回一個字符還是字符串?

不管怎麼說,我需要一種方法來枚舉轉換爲可讀取字母,例如打字到一個自定義文本框,所以我做了類似的擴展方法,以便:

public static char ToChar(this Keys obj, bool shift, bool caps) 
{ 
    switch (obj) 
    { 
     case (Keys.A): return (shift^caps) ? 'A' : 'a'; 
     case (Keys.B): return (shift^caps) ? 'B' : 'b'; 
     case (Keys.C): return (shift^caps) ? 'C' : 'c'; 

     ... 

     case (Keys.OemOpenBrackets): return (!shift) ? '[' : '{'; 
     case (Keys.OemCloseBrackets): return (!shift) ? ']' : '}'; 
     case (Keys.OemPipe): return (!shift) ? '\\' : '|'; 
     case (Keys.OemSemicolon): return (!shift) ? ';' : ':'; 
     case (Keys.OemQuotes): return (!shift) ? '\'' : '"'; 
     case (Keys.OemComma): return (!shift) ? ',' : '<'; 
     case (Keys.OemPeriod): return (!shift) ? '.' : '>'; 
     case (Keys.OemQuestion): return (!shift) ? '/' : '?'; 

     ... 

     default: return ' '; 
    } 
} 

我並不十分關心速度,因爲這隻會被調用爲用戶可以輸入的速度,而不是緊密的循環。但是,混合箭頭鍵或向上翻頁將導致,返回一個空白字符(按默認值)。

使用char?會更有意義嗎?在使用非打印字符的情況下返回null?或者可能是string,這樣我可以返回String.Empty

+1

根據您可能需要多少信息,字符串可能更有意義,或者您也可以創建自己的類型,該類型可能包含有關按下的鍵的上下文,並且可能同樣包含該鍵作爲其屬性之一。 – trnelson 2014-11-02 03:40:16

+1

嘗試用'return'\ 0''替換'return''',[空字符](http://msdn.microsoft.com/en-us/library/aa691087(v = vs.71).aspx) 。 – 2014-11-02 03:44:54

+0

我傾向於字符,因爲它感覺「更輕」,並且在按鍵環境中更有意義。我也有上下文,因爲此方法(可能)被稱爲對按鍵事件的響應。 – 2014-11-02 03:48:08

回答

1

嘗試更換此,它返回一個空:

return ' '; 

有了這個,其中\0代表null character

return '\0'; 

既然你顯示這些文字,希望現在你不會得到一長串空格。

+0

我正在使用Console.WriteLine()來測試輸入,因爲我輸入它,它似乎大部分工作正常。但是,如果我將它傳遞給上面的'\ 0',它似乎不會打印任何字符。你會碰巧知道爲什麼? – 2014-11-02 04:28:25

+1

我不知道。我也可以複製它。顯然它對這個輸入並不滿意,但我不確定內部發生了什麼。我想作爲一種解決方法,你可以檢測到'\ 0'被返回,而不是寫出來的控制檯。 – 2014-11-02 13:32:08

相關問題