4

我想为用户提供ToolStripMenuItem.ShortcutKeys通过配置文件设置的选项,所以我发现我需要以某种方式转换stringKeys.

已经找到了如何使用 对简单值执行此操作Enum.Parse,但它无法识别以下格式:

  • Ctrl+i(末尾有空格)
  • i
  • Ctrl+Alt+Esc

问:是否有任何将 stings ( )解析为 的标准化方法?Ctrl+iKeys

我想避免编写我自己的函数,它将文本分成几部分,然后分别处理每个案例/特殊字符串。

4

2 回答 2

12

您在“属性”窗口中看到的 ShortcutKeys 属性的字符串是由 TypeConverter 生成的。您也可以在自己的代码中使用该类型转换器。像这样:

    var txt = "Ctrl+I";
    var cvt = new KeysConverter();
    var key = (Keys)cvt.ConvertFrom(txt);
    System.Diagnostics.Debug.Assert(key == (Keys.Control | Keys.I));

请注意,I或者Ctrl+Alt+Escape不是有效的快捷键。KeysConverter 不会抱怨,分配 ShortCutKeys 属性时会出现异常。用 try/except 包装两者以捕获无效的配置数据。

于 2013-09-04T12:26:34.010 回答
0

是的,您可以用 a 分隔值,- 但是您的字符串仍然需要按摩,因为Ctrl并且Esc不是有效值Keys。它们仍然需要是有效值。所以考虑下面的代码:

var keys = "Ctrl+Alt+Esc";
keys = keys.Replace("+", ",").Replace("Ctrl", "Control").Replace("Esc", "Escape");
var k = (Keys)Enum.Parse(typeof(Keys), keys);

此外,下面是Enum类中的代码:

string[] array = value.Split(Enum.enumSeperatorCharArray);
ulong[] array2;
string[] array3;
Enum.GetCachedValuesAndNames(runtimeType, out array2, out array3, true, true);
for (int i = 0; i < array.Length; i++)
{
    array[i] = array[i].Trim();
    bool flag = false;
    int j = 0;
    while (j < array3.Length)
    {
        if (ignoreCase)
        {
            if (string.Compare(array3[j], array[i], StringComparison.OrdinalIgnoreCase) == 0)
            {
                goto IL_152;
            }
        }
        else
        {
            if (array3[j].Equals(array[i]))
            {
                goto IL_152;
            }
        }
        j++;
        continue;
        IL_152:
        ulong num2 = array2[j];
        num |= num2;
        flag = true;
        break;
    }
    if (!flag)
    {
        parseResult.SetFailure(Enum.ParseFailureKind.ArgumentWithParameter, "Arg_EnumValueNotFound", value);
        return false;
    }
}

的值为enumSeperatorCharArray

private static readonly char[] enumSeperatorCharArray = new char[]
{
    ','
};
于 2013-09-04T12:16:31.980 回答