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
이라는 이 있는데 이는 정확히 원하는 것입니다. 물론 코드에 액세스 할 수 없습니다.
각 자식 StackPanel
에 MouseLeftButtonDown
처리기를 추가하여 문제를 해결할 수 있습니다. 마지막으로 선택한 것을 저장 한 다음 ContextMenu
처리기에서 검색하지만이 솔루션은 약간 추한 것 같습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
미리 도움 주셔서 감사합니다.
을 Name 속성 – Praetorian
@Praetorian 죄송합니다.'Name'은 예제 일 뿐이며 객체의 이름을 지정한 경우에만 관련이 있습니다. 다른 대안으로 대답을 확장했습니다. –
좋습니다. 작동하는 것 같습니다 (편집시 오타가 있습니다. 클래스 이름은'VisualTreeHelper'이어야합니다). 나는 원래의 접근법을 포기했다. 왜냐하면 추가적인 결함이 있었기 때문에 동일한 컨텍스트 메뉴 객체를 여러 부모에게 붙일 수 없다. 이제는 상황에 맞는 메뉴를 즉석에서 작성하고 있습니다. – Praetorian