2012-09-28 3 views
1

"Ctrl + C, Ctrl + V 등"과 같은 바로 가기가있는 ToolStripMenuItems를 마우스 오른쪽 단추로 클릭하면 ContextMenuStrip이있는 TreeView가 있습니다.ContextMenuStrip ToolStripMenuItem의 바로 가기 키는 어떻게 작동합니까?

문제는 ContextMenuStrip을 연 경우에만 ToolStripMenuItem.Click의 동작이 바로 가기로 실행된다는 것입니다.

ContextMenuStip이 숨겨져있을 때도 바로 가기가 작동해야한다고 생각합니다.

내가 잘못했거나 ShortCuts가 전역이 아니며 TreeView의 KeyPress 이벤트를 지정하고 바로 가기 논리를 여기에 할당해야합니다. Thnx.

답변

0

예 Treeview 용 코드를 작성해야하는 경우 사용자 요구 사항에 따라 키를 누르거나 키를 누를 수도 있습니다.

+0

이상한 일이지만, KeyDown TreeView 이벤트의 args.KeyData가 바로 가기로 설정된 조합과 일치하지 않습니다. 추가 수정 자의 키 코드가 있습니다. – ForeverSmiling

+0

하지만 어리석은 방법으로 문제가 해결되었습니다. 실수로 동일한 단축키를 다른 menuItem에 설정했습니다. 내가 고치면 ContextMenuStrip 바로 가기가 숨겨져 있으면 잘 작동한다는 것을 알게되었습니다. – ForeverSmiling

2

동일한 문제가있어서 ContextMenuStrip이 이미 제공하는 액세스 기능을 다시 프로그래밍하고 싶지 않았습니다.

큰 문제는 내가 ContextMenuStrip 항목을 확장하거나 변경할 때 자체 키 이벤트를 변경하거나 변경해야한다는 것입니다. 내 목표는이를 우회하여 글로벌 바로 가기 키를 ContextMenuStrip으로 리디렉션하여 코드별로 클릭을 수행하는 것이 었습니다.

private List<ToolStripMenuItem> getContextMenuItems(ToolStripItemCollection items) 
    { 
     List<ToolStripMenuItem> result = new List<ToolStripMenuItem>(); 
     foreach (ToolStripMenuItem item in items) 
     { 
      result.Add(item); 
      if (item.HasDropDownItems) 
      { 
       result.AddRange(this.getContextMenuItems(item.DropDownItems)); 
      } 
     } 
     return result; 
    } 

그럼 내가 래퍼 컨트롤에 내 키를 잡는 KeyUp 이벤트를 설정 :

첫째, 나는 나에게 반복적으로 ContextMenuStrip 하나 목록의 모든 ToolStripMenuItems을 유도 할 수있는 방법을 만들었습니다. this.cmsCellRightClickContextMenuStrip입니다 :

private void xxxxx_KeyUp(object sender, KeyEventArgs e) 
    { 
     Keys pressed = e.KeyCode; 
     if (e.Control) pressed = pressed | Keys.Control; 
     if (e.Shift) pressed = pressed | Keys.Shift; 
     if (e.Alt) pressed = pressed | Keys.Alt; 

     ToolStripMenuItem actionItem = this.getContextMenuItems(this.cmsCellRightClick.Items) 
      .Where(x => x.ShortcutKeys == pressed).FirstOrDefault(); 
     if (actionItem != null) 
     { 
      actionItem.PerformClick(); 
     } 
     e.SuppressKeyPress = true; 
    } 

결과는 내 키 입력을 잡아 내 ContextMenuStrip로 보내 클릭을 수행되면, ContextMenuStrip가 열려 있지/숨겨진 경우에도.

+0

컨텍스트 메뉴에 구분 기호가 있으면'getContextMenuItems' 메서드가 실패 할 수 있습니다 (_InvalidCastException_을 높이기). 이것은 foreach 루프에서 일반적인'ToolStripItem'을 사용하고'ToolStripMenuItem'으로 캐스팅이 성공했는지를 검사함으로써 회피 될 수 있습니다. –