동일한 문제가있어서 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.cmsCellRightClick
내 ContextMenuStrip
입니다 :
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
가 열려 있지/숨겨진 경우에도.
이상한 일이지만, KeyDown TreeView 이벤트의 args.KeyData가 바로 가기로 설정된 조합과 일치하지 않습니다. 추가 수정 자의 키 코드가 있습니다. – ForeverSmiling
하지만 어리석은 방법으로 문제가 해결되었습니다. 실수로 동일한 단축키를 다른 menuItem에 설정했습니다. 내가 고치면 ContextMenuStrip 바로 가기가 숨겨져 있으면 잘 작동한다는 것을 알게되었습니다. – ForeverSmiling