【问题标题】:Key (enum) to string键(枚举)到字符串
【发布时间】:2011-06-27 20:12:05
【问题描述】:

如何将一个键(KeyEventArgs 中的键)转换为字符串。

例如,如果用户输入“-”:

e.Key.ToString() = "Subtract"
new KeyConverter().ConvertToString(e.Key) = "Subtract"

我想要的是得到“-”作为结果,而不是“减去”...

【问题讨论】:

标签: c# enums key


【解决方案1】:

使用Dictionary<TKey, TValue>

类级:

private readonly Dictionary<string, string> operations = new Dictionary<string, string>;

public ClassName() {
    // put in constructor...
    operations.Add("Subtract", "-");
    // etc.
}

在您的方法中,只需使用operations[e.Key.ToString()]

编辑:实际上,为了提高效率:

private readonly Dictionary<System.Windows.Input.Key, char> operations = new Dictionary<System.Windows.Input.Key, char>;

public ClassName() {
    // put in constructor...
    operations.Add(System.Windows.Input.Key.Subtract, '-');
    // etc.
}

在您的方法中,只需使用operations[e.Key]

【讨论】:

  • 为什么不使用Dictionary&lt;Key, string&gt;
  • @svick:你说的时候我正在做出改变 :)
  • 这可能比switch-case 更好......我想我会因为建议Dictionary&lt;Key, string&gt; 而被枪杀
  • @Svick:我之前曾建议使用枚举作为 TKey,但有几个人告诉我“坏主意”......虽然我不明白为什么会这样
  • @IAbstract,可能是因为在某些情况下,具有静态属性的普通类(如Key.Subtract)而不是枚举成员和实例属性(如Key.Char)而不是你想要放入的阵列会更好。但这在这里是不可能的,因为我们无法更改 Key
【解决方案2】:

帖子生成“减去”是因为Key 返回一个KeyCode,一个枚举,Subtract 是其中的成员。

如果没有明确的映射,就无法从中获得“-”。 (对于显式映射,请使用开关、if/else、字典或任何你喜欢的东西:-)

要获得字符而不是键码,也许使用不同的事件?

愉快的编码

【讨论】:

    【解决方案3】:

    如果你想将 Keys 对象转换为字符串对象,可以使用强制转换,如下所示:

    string key = ((char)e.Key).ToString();
    

    请记住,Keys 对象可以接受 char 转换,因此我们可以将生成的 char 对象转换为字符串对象。 如果您只想将其附加到 char 对象,只需删除该废话,并使其如下所示:

    char key = (char)e.key;
    

    【讨论】:

    • 你可以,但不会有帮助。由于冲突,Key-Enum 值和字符集值之间的双射映射根本不可能(Key.NumPad0 和 Key.D0 必须具有不同的值,但都应该导致字符“0”)。事实上,Key-Enum 的整个映射与任何字符集都不同。只需在 Visual Studio 中的 Key-Enum 上按 F12 并说服自己
    • 他想将 Keys 对象的值作为字符串获取,而不是相反,所以我可以在这里看到没有问题 @0xDEADBEEF
    【解决方案4】:

    你可以使用这样的函数:

    public static string KeycodeToChar(int keyCode)
    {
        Keys key = (Keys)keyCode;
    
        switch (key)
        {
            case Keys.Add:
                return "+";
            case Keys.Subtract:
                return "-"; //etc...
            default:
                return key.ToString();
        }
    }
    

    【讨论】:

      【解决方案5】:

      您可以使用 Description 属性,然后覆盖 ToString() 以获取“-”而不是名称。这是一篇解释如何做到这一点的文章http://blogs.msdn.com/b/abhinaba/archive/2005/10/20/c-enum-and-overriding-tostring-on-it.aspx

      【讨论】:

      • 非常有趣的文章。你知道这种技术是否可以应用于现有类型吗?
      • 当然。您只需要访问源即可添加描述属性
      • 啊。这个枚举虽然是 .NET 的一部分 :(
      猜你喜欢
      • 2011-11-02
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多