2009-08-09 4 views
3

선택한 폴더에있는 모든 폴더, 하위 폴더 및 파일의 목록을 포함하는 컨텍스트 메뉴를 만듭니다. 메뉴를 클릭하면 파일과 폴더가 열리길 원하지만 menuitem에 하위 항목이 있으면 click 이벤트가 등록되지 않습니다.하위 항목이있는 메뉴 항목에서 클릭 이벤트 받기 (C#)

void Foo(string Title) 
{ 
    MenuItem = new MenuItem(Title); 
    MenuItem.Click += new EventHandler(MenuItem_Click); 
    ContextMenu.MenuItems.Add(MenuItem); 
} 

void MenuItem_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("This box will only show when menuitems without subitems are clicked"); 
} 

메뉴 항목에 하위 항목이 있어도 어떻게 클릭 이벤트를 실행할 수 있습니까?

답변

4

메뉴가 여기에 가장 적합한 UI 위젯이 아닐 수도 있습니다. 클릭 이벤트가 발생하지 않는 이유는 하위 메뉴가있는 메뉴 항목이 인 것으로 가정 되었기 때문일뿐입니다.은 다른 작업을 실행하는 대신 클릭 할 때 자녀를 확장합니다.

사용자의 가정 일 수도 있습니다.

이 동작 MenuItem.Click에 대한 문서에서 언급 한 :

참고하십시오 의 MenuItem의 메뉴 아이템 속성은 모든 항목이 포함되어있는 경우,이 이벤트가 발생하지 않습니다. 이 이벤트는 상위 메뉴 항목에 대해 발생하는 이 아닙니다.

+0

을 무시할 수의 ContextMenu

public class MyContextMenu : ContextMenu { override protected void OnPopUp(EventArgs e) { if (this.MenuItems.Count == 0) base.OnPopUp(e); // else do nothing } } 

하위 클래스를 시도 할 수 대부분의 폴더, 파일, 웹 사이트 등을 매우 쉽게 사용할 수 있습니다. 내 생각은 오른쪽 클릭 메뉴가있는 트레이 아이콘으로 사용하지 않을 때는 쉽게 액세스하고 숨길 수있는 다른 컨트롤을 볼 수 없기 때문입니다. 이벤트를 발생시키는 방법은 없습니다. –

+0

거친 해킹없이, 나는 의심한다. "[이 디렉토리]"라는 이름으로 각 디렉토리 아래에 "리프"메뉴 항목을 추가 할 수 있습니다. 네비게이션을 클릭하는 사용자와 "이 디렉토리 열기"를 클릭하는 것의 차이를 어떻게 감지합니까? –

+0

예, "리프"메뉴 항목은 현재 구현이지만 많이 좋아하지는 않습니다. 사용자는 탐색 할 때 클릭 할 필요가 없습니다. 팝업 메뉴는 자동입니다 (더블 클릭 이벤트가 지원되는 경우 혼동을 최소화하기위한 옵션 일 수 있습니다). –

1

툴팁에서 팝업을 시작한 경우 툴팁을 서브 클래스 화하고이 코드를 추가 할 수 있습니다.

override protected void OnItemClicked(ToolStripItemClickedEventArgs e) 
    { 
    if (this.Items.Count == 0) 
     base.OnItemClicked(e); 

    // else do nothing 
    } 

그러나, ContextMenu 클래스는 OnItemClicked하지만 onPopup 가지고하지 않습니다. 나는 그것을 시도하지 않은하지만 당신은 그 다음 작동하지 않는 경우, 당신은 액세스를 제공하는 작은 응용 프로그램이 있어야하는데 두 가지 방법을 보여준다

public class MyContextMenu : ContextMenu 
{ 
    override protected void Show (Control c, Point p) 
    { 
     if (this.MenuItems.Count == 0) 
      base.Show (c, p) ; 

     // else do nothing 
    } 

    override protected void (Control c, Point p, LeftRightAlignment z) 
    { 
     if (this.MenuItems.Count == 0) 
      base.Show (c, p, z) ; 

     // else do nothing 
    } 
} 
+0

나는 논리가 작동하는지 모르겠지만,의 ContextMenu를 서브 클래스와 경우 (항목 수> 0) 쇼 하위 항목 다른 쇼 바로 가기를 사용하여 자신의 논리와 클릭을 차단하는 그림입니다 –