2010-05-12 4 views
5

항목이있는 ListBox가 있고 세 개의 메뉴 항목이있는 ContextMenu가 지정되어 있습니다. 메뉴 항목 중 하나에서 오랜 시간 작동이 시작된다는 것을 제외하고는 모든 것이 올바르게 작동합니다. 핸들러에서 ContextMenu를 닫으 려하고 hour-glass 커서 또는 다른 것을 표시하고 싶습니다.ContextMenu를 강제로 닫을 수 있습니까 (WPF 프로젝트)?

할 수 있습니까? 아니면 대신 Popup을 사용해야합니까? 그렇다면 ContextMenu 대신 Popup을 사용하려면 어떻게해야합니까? 내 가정은 배치와 수명을 완전히 관리해야한다는 것입니다.

감사합니다.

답변

7

당신은 단순히 Dispatcher.BeginInvoke 아래 lengthly 작업을 실행할 수 있습니다

private void OnSomeContextMenuCommand(object sender, EventArgs e) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 
    { 
    // Put long-running operation here 
    })); 
} 

을이 작업을 수행 할 경우의 ContextMenu이 장기 실행 작업이 시작되기 전에 종료됩니다.

일반적으로 UI 처리를 완전히 분리하기 때문에 ContextMenu를 명시 적으로 닫는 것이이 솔루션을 선호합니다.

+0

안녕하세요 @ 레이 위의 제안을 시도했지만 그것은 나를 위해 작동하지 않습니다, 나는 잘못하고 있습니까? 에 Application.Current.Dispatcher.BeginInvoke (DispatcherPriority.Background 새로운 액션 (() => { 의 foreach (TreeViewItem 항목 (treeViewAdv.Items [0]와 같은 TreeViewItem) .Items) { _RunTestScript (항목) ; } }})); – Prithiv

13

은 당신이 원하는 것은 :

myContextMenu.IsOpen = false; 

은 긴 작업이 발생이 전에 호출해야합니다. 작업에 따라 다른 스레드에서 작업을 수행하여 비동기로 만들 것을 고려할 수 있습니다. 이렇게하면 응용 프로그램 스레드를 중단하지 않습니다.

+0

Ray Burns는 아마도 묻는 상황에 대해 더 나은 대답을했을지 모르지만 때로는 다른 이유로 문맥 메뉴를 닫고 싶을 때도 있습니다.이 경우 가장 좋은 대답입니다. – viggity

관련 문제