2013-09-04 2 views
4

구성 파일을 통해 ToolStripMenuItem.ShortcutKeys을 설정하는 옵션을 제공하려는 사용자에게 stringKeys으로 변환해야한다는 것을 알아 냈습니다.문자열의 단축키

  • Ctrl+i (끝 공간)
  • i
  • Ctrl+Alt+Esc
  • :

    나는 Enum.Parse를 사용하여 간단한 값을 그렇게하지만 같은 형식을 인식하지 방법 already found했습니다

Q :표준화 구문 분석 방법 (Ctrl+i)을 Keys?

텍스트를 조각으로 나눈 다음 각 사례/특수 문자열을 별도로 처리하는 자체 기능을 작성하는 것을 피하고 싶습니다.

답변

11

또한

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

을, 여기에 데리러가는 년대 Enum 클래스의 코드는 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로 둘 다 감싼다.

0

예, 당신이 ,로 값을 분리 할 수는 - CtrlEscKeys 값이 유효하지 않기 때문에 그러나 당신의 캐릭터는 여전히 마사지해야합니다. 여전히 유효한 값이어야합니다. 그래서 다음 코드를 고려하십시오

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[] 
{ 
    ',' 
}; 
+0

필자는 자신의 파서를 쓰지 않으려 고했지만 (+ 이와 비슷한 것으로 끝날 것이지만), '+, -'를 치고 공백을 없애고 단일 문자에 대해 ToUpper()를 사용하고 ToLower)'와 더 긴 이름으로 맵핑하지만, 내 경험에 의하면 당신은 항상 이와 같은 소스에서 뭔가를 잊어 버릴 것입니다. – Vyktor

+0

@Vyktor, 당신은 당신 자신의 파서를 쓰고 있지 않습니다. 그러나 문자열을'Enum' 클래스가 문자열을 실제로 파싱 할 수있는 상태로 문자열을 가져와야합니다. 'Ctrl'을 어떻게 해석 할 것으로 기대하십니까? 그게 기적적으로 '통제'로 바뀌나요? 제 말은 여러분이 그것을 약간 마사지해야한다는 말입니다.하지만','이 내장되어 있기 때문에 분리 할 수있는 곳을 찾았습니다. 그리고 나서 약자를 그냥 마사지하십시오. –