我想为用户提供ToolStripMenuItem.ShortcutKeys
通过配置文件设置的选项,所以我发现我需要以某种方式转换string
为Keys
.
我已经找到了如何使用 对简单值执行此操作Enum.Parse
,但它无法识别以下格式:
Ctrl+i
(末尾有空格)i
Ctrl+Alt+Esc
问:是否有任何将 stings ( )解析为 的标准化方法?Ctrl+i
Keys
我想避免编写我自己的函数,它将文本分成几部分,然后分别处理每个案例/特殊字符串。
我想为用户提供ToolStripMenuItem.ShortcutKeys
通过配置文件设置的选项,所以我发现我需要以某种方式转换string
为Keys
.
我已经找到了如何使用 对简单值执行此操作Enum.Parse
,但它无法识别以下格式:
Ctrl+i
(末尾有空格)i
Ctrl+Alt+Esc
问:是否有任何将 stings ( )解析为 的标准化方法?Ctrl+i
Keys
我想避免编写我自己的函数,它将文本分成几部分,然后分别处理每个案例/特殊字符串。
您在“属性”窗口中看到的 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 包装两者以捕获无效的配置数据。
是的,您可以用 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[]
{
','
};