2013-03-15 4 views
3

런타임에 생성 할 수있는 동적 컨텍스트 메뉴를 만드는 솔루션을 찾고 있습니다. 나는 정상적인 명령 패턴과 비슷한 것을 구현하는 IGuiCommand 인터페이스를 구현했다.동적 컨텍스트 메뉴

interface IGuiCommand 
{ 
    Execute(); 
    Undo(); 
    bool CanUndo {get;set;} 
    Redo(); 
    string CommandName {get;set;} 
    string CommandDescription {get;set;} 
} 

아이디어는 주어진 컨텍스트 메뉴에 표시 할 명령 목록을 제출하기 위해 마우스 오른쪽 단추를 클릭하는 것을 허용하는 것입니다.

각 컨트롤에 상황에 맞는 메뉴를 만들 수도 있지만 단일 상황에 맞는 메뉴를 사용하고 런타임에 관리하기 쉽도록 동적으로 메뉴를 생성하는 것이 좋습니다. 제어 상태 나 응용 프로그램 상태가 변경되면 컨텍스트 메뉴에 변경 내용이 반영되기를 바랍니다. 예를 들어, 체크 박스를 마우스 오른쪽 버튼으로 클릭하면, 체크 박스는 컨텍스트 메뉴에 체크 박스의 현재 체크 된 값에 따라 표시 할 활성화 또는 비활성화 명령을 제출합니다.

특정 컨트롤에 대한 컨텍스트 메뉴를 표시하기 위해 어떤 컨트롤이 "마우스 오른쪽 단추로 눌렀는지"알 수있는 방법이 있다면 쉽게 구현할 수 있다고 생각합니다.

그것은 (팝업으로 상황에 맞는 메뉴를 야기 또는 무엇이든 명령)을 우측 클릭 된 컨트롤을 나타냅니다 EventArg 당신은 단지 ContextMenuStrip_Opening 이벤트를 재정의해야

+0

나는 단지 그 정보를 추가하지 않았다는 것을 깨달았습니다. 그것은 WinForms입니다 태그를 추가합니다 – galford13x

+0

이것은 WinForms에 대한 어려운 질문이어야합니다. 그러나 누군가 WPF에 대해 어떻게 수행 될지에 대한 대답을 가지고 있다면 나는 모든 귀입니다. 지금은 작은 유틸리티로 GUI를 재실행하기 때문에 WPF에서 할 수 있습니다. – galford13x

답변

2

를 제공하지 않는 ContextMenu 이벤트를 놀라게 보인다. 보낸 사람 개체는 ContextMenuStrip이며 SourceControl 요소가 들어 있습니다. 적절한 캐스트를 적용하면 필요한 모든 것을 이용할 수 있습니다.

private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) { 
    var contextMenu = (sender as ContextMenuStrip); 
    if (contextMenu != null) { 
    var sourceControl = contextMenu.SourceControl; 
    contextMenuStrip1.Items.Clear(); 
    //contextMenuStrip1.Items.Add(...); 
    } 
} 
+0

사실 내가 주변을 둘러 보았을 때 ContextMenuStrip이 아닌 이전 ContextMenu를 사용하려고 시도했음을 발견했습니다. 필요한 모든 기능은 새로운 ContextMenuStrip 컨트롤에 있습니다. 응답 해 주셔서 감사합니다. – galford13x