2010-12-30 7 views
1

StackPanel의 내용을 XML 파일을 읽어서 응용 프로그램에 동적으로 채우고 있습니다. StackPanel의 각 하위는 다른 UIElement 개체를 포함하는 또 다른 StackPanel입니다. StackPanel 디자인을 중첩 한 이유는 세 가지 ContextMenu 중 하나를이 자식 StackPanel과 연결하기 때문입니다.WP7 ContextMenu의 소유자 찾기

그래서 구조는 다음과 같습니다

나는 세 사이 ContextMenu의에서 선택하고 다음을 부착하고있어 각 StackPanel 자녀에 대한
---- StackPanel parent 
     | 
     ---- StackPanel child 
     | | 
     | ---- TextBlock 
     | 
     ---- StackPanel child 
     | | 
     | ---- TextBox 
     | 
     ---- StackPanel child 
     | | 
     | ---- Image 
     | 
     . 
     . 
     . 

:

var stackPanels = parentStackPanel.Children.OfType<StackPanel>(); 

for(int i = 0; i < stackPanels.Count(); ++i) { 
    if(someCondition) { 
    ContextMenuService.SetContextMenu(stackPanels.ElementAt(i), MyContextMenu1); 

    } else if(someOtherCondition) { 
    ContextMenuService.SetContextMenu(stackPanels.ElementAt(i), MyContextMenu2); 

    } else { 
    ContextMenuService.SetContextMenu(stackPanels.ElementAt(i), MyContextMenu3); 

    } 
} 

모든 MenuItem의 모든 3에서 ContextMenu에는 동일한 Click 처리기가 있습니다.

마지막으로, 질문 : 어떻게 StackPanel 자식의 ContextMenu이 호출되어 클릭되었는지 확인하려면 어떻게해야합니까? 디버거에서 클릭 핸들러 내에서 보낸 사람 개체를 검사하면 StackPanel에 대한 참조가 포함 된 Owner이라는 이 있는데 이는 정확히 원하는 것입니다. 물론 코드에 액세스 할 수 없습니다.

각 자식 StackPanelMouseLeftButtonDown 처리기를 추가하여 문제를 해결할 수 있습니다. 마지막으로 선택한 것을 저장 한 다음 ContextMenu 처리기에서 검색하지만이 솔루션은 약간 추한 것 같습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

미리 도움 주셔서 감사합니다.

답변

1

sender을 클릭 이벤트 처리기에 UIElement으로 전송하면 클릭 한 실제 항목을 식별하는 데 필요한 정보를 얻을 수 있어야합니다.

(sender as UIElement).Property 

는 대안 DependencyObject에로 주조 (가능한 경우) 및 시각적 트리 걷는 것을 사용 : 나는 디버거 시계 창에서 UIElement에가이 없음을 알리는 오류가 발생했습니다 것을 시도

VisualTreeHelper.GetParent((sender as DependencyObject)) 
+0

을 Name 속성 – Praetorian

+0

@Praetorian 죄송합니다.'Name'은 예제 일 뿐이며 객체의 이름을 지정한 경우에만 관련이 있습니다. 다른 대안으로 대답을 확장했습니다. –

+0

좋습니다. 작동하는 것 같습니다 (편집시 오타가 있습니다. 클래스 이름은'VisualTreeHelper'이어야합니다). 나는 원래의 접근법을 포기했다. 왜냐하면 추가적인 결함이 있었기 때문에 동일한 컨텍스트 메뉴 객체를 여러 부모에게 붙일 수 없다. 이제는 상황에 맞는 메뉴를 즉석에서 작성하고 있습니다. – Praetorian