2012-08-25 4 views
3

Windows 대화 상자가 모델 대화 상자로 표시됩니다. 클래스 ContextMenuStrip의 컨텍스트 메뉴가 있습니다. 컨텍스트 메뉴에서 여러 항목에 대한 바로 가기를 설정합니다. 그러나이 바로 가기는 컨텍스트 메뉴가 표시 될 때만 작동합니다. 상황에 맞는 메뉴가 활성화되지 않은 경우에도 해당 기능을 작동시키는 방법은 무엇입니까?컨텍스트 메뉴에서 바로 가기 처리

양식의 KeyPress 이벤트를 처리하고 컨텍스트 메뉴의 모든 항목을 재귀 적으로 반복하여 해당 ShortcutKeys 속성을 실제 누른 키와 비교하는 것이 유일한 방법입니다. 일치하면이 항목에 대해 OnClick 이벤트로 수동 호출하십시오. 더 좋은 아이디어?

+0

그럼 난 상황에 맞는 메뉴가 활성화되지 않은 경우 바로 가기가 작동하지 않는 이유를 잘 모르겠지만, 하나 개의 제안, 당신은 키를 눌러 이벤트를 처리하고 키 조합을 결정할 때, 키 조합과 관련된 함수를 호출하면됩니다. 프로그래밍 방식으로 컨텍스트 메뉴를 반복하는 이유는 무엇입니까? –

+0

이렇게하면 코드 중복을 피할 수 있습니다. 메뉴에 바로 가기가 있기를 원하기 때문에 거기에 지정해야하며 거기에 핸들러를 설정해야합니다. 그리고이 둘 모두를 지정하는 유일한 장소 여야합니다. – Mikhail

+0

한 가지 제안은 내가 줄 수있는 것입니다, Ctrl 키를 사용하여 shourtcut을 생성하고 메뉴가 닫힐 때 작동하는지 확인하십시오. –

답변

1

마지막으로, 나는 KeyPressed 이벤트 처리기에서 수동 반복을 구현했습니다 : 당신이 필요 반복하지 않고 이벤트 핸들러를 호출 할 수 있도록

Action<ToolStripMenuItem> check_shortcut = null; 

    check_shortcut = (node) => 
    { 
    if (node.ShortcutKeys == e.KeyData) 
    { 
     node.PerformClick(); 
    } 
    foreach (ToolStripMenuItem child in node.DropDownItems) 
    { 
     check_shortcut(child); 
    } 
    }; 

    foreach (ToolStripMenuItem item in MyContextMenuStrip.Items) 
    { 
    check_shortcut(item); 
    } 
+0

답을 수정했습니다 : 일부 수정 사항, 올바른 이벤트는 KeyDown입니다. foreach에서는 구분 기호 인 경우 예외가 발생하기 때문에 개체가 ToolStripMenuItem인지 확인해야합니다. – Pedro77

+0

그리고 아마도 모든 KeyDown 이벤트가 확인되도록 폼에'KeyPreview = true;'를 설정해야합니다. – stonito

+0

또한, 메뉴에 구분 기호가 포함되어있는 경우, ToolStripMenuItem 객체에 대한 캐스트 오류 예외 검사 바로 가기를 방지하려면'node.DropDownItems.OfType ())'을 사용하여'node.DropDownItems '을 변경해야합니다. – stonito

0

ContextMenuStrip 코드를 열거 나 의 ContextMenuStrip 속성을 만든 사람이 ContextMenuStrip으로 설정되어 있습니까? 코드로 열리는 경우 대신 Form 속성을 설정할 수 있습니까? 그렇게하면 먼저 메뉴를 열지 않고도 바로 가기를 수행 할 수 있습니다.

2

는 ToolStripMenuItem.ShortCutKeys 속성을 사용합니다.

샘플 코드 :

ContextMenuStrip _contextMenuStrip = new ContextMenuStrip(); 
var menuItem = new ToolStripMenuItem("Copy"); 
menuItem.ShortcutKeys = Keys.Control | Keys.C; 
_contextMenuStrip.Items.Add(menuItem);