2017-01-13 1 views
0

상당히 고급 명령 시스템이있는 기존 WPF 응용 프로그램이 있습니다. 현재 비슷한 명령 시스템을 채택하고자하는 WinForms 응용 프로그램을 개발 중입니다. 이것은 잘 진행되고 있지만 단축키와 키 바인딩 변환에 어려움을 겪고 있습니다. WPF 케이스를 들어 Windows Forms 용 InputBinding

, 나는 윈폼 Control에 대한 InputBindings를 추가하는 방법이 있나요 다음과 같은 방법

public void BindKeyGestures(UIElement uiElement) 
{ 
    foreach (var keyboardShortcut in _keyboardShortcuts) 
    { 
     if (keyboardShortcut.KeyGesture != null) 
     { 
      uiElement.InputBindings.Add(new InputBinding(
       _commandService.GetTargetableCommand(_commandService.GetCommand(keyboardShortcut.CommandDefinition)), 
       keyboardShortcut.KeyGesture)); 
     } 
    } 
} 

를 통해 사용자 인터페이스 요소에 명령의 키 동작을 결합 (I은 그대로이 가능성이 생각 WPF 구조체), 포함되어 있지 않은 경우 포함 양식의 ProcessCmdKey을 명시 적으로 재정의하지 않고도 바로 가기를 추가하려면 어떻게해야합니까?

+0

WPF의 주요 이유는 모든 윈폼 제한입니다 ... – Phil1970

+0

내가 이해하고 동의합니다. 하지만 유감스럽게도 WinForms를 사용하는 것 외에는 옵션이 없습니다. '[이 프로젝트의 경우. – MoonKnight

답변

1

사용할 수있는 ShortcutKeys 속성이있는 몇 가지 특정 컨트롤 (도구 상자 항목, 메뉴 항목)이 있습니다 (예 : https://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripmenuitem.shortcutkeys(v=vs.110).aspx).

다른 컨트롤의 경우, 내가 아는 모든 기능이 없으므로 직접 시스템을 만들어야합니다. 그렇지 않으면 예외를 던질 것, 이것은 컨트롤이 양식에 할당 된 후에 호출 할 필요가

public static void Bind(this Control control, Keys shortcut, Action action) 
    { 
     Form form = control.FindForm(); 
     if (form == null) throw new NullReferenceException($"Form not found for control: {control.Text ?? control.ToString()}"); 
     form.KeyPreview = true; 
     form.KeyDown += (sender, args) => 
     { 
      if (args.KeyData == shortcut) action(); 
     }; 
    } 

: 다음은 사용할 수있는 간단한 확장 방법입니다. 또한 KeyDown 이벤트의 등록 취소는 다루지 않습니다 (제어 + 바로 가기 + 대리자 삼중 항을 캐싱하는 선을 따라 뭔가를 수행 한 다음 Unbind를 호출 할 때 가입 취소).

위의 코드

는 다음과 같이 사용할 수 있습니다

Button button = new Button { Text = "Click Me!" }; 
form.Controls.Add(button); 
.... 
button.Bind(Keys.F | Keys.Control,() => doSomething()); //Will do something on Ctrl+F