WP7 Поиск владельца ContextMenu - PullRequest
1 голос
/ 30 декабря 2010

Я динамически заполняю содержимое StackPanel в моем приложении, читая файл XML.Каждый потомок StackPanel сам по себе является другим StackPanel, который содержит различные UIElement объекты.Причина вложенного StackPanel дизайна в том, что я хочу связать один из 3 различных ContextMenu s с этими дочерними StackPanel s.

Таким образом, структура выглядит следующим образом:

  ---- StackPanel parent
       |
       ---- StackPanel child
       |    |
       |    ---- TextBlock
       |
       ---- StackPanel child
       |    |
       |    ---- TextBox
       |
       ---- StackPanel child
       |    |
       |    ---- Image
       |
       .
       .
       .

Для каждого StackPanel ребенка я выбираю из 3 ContextMenu с и прикрепляю их следующим образом:

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 вызвали и нажали?Проверка объекта отправителя в обработчике кликов в отладчике показывает, что ContextMenu имеет internal DependencyObject с именем Owner, который содержит ссылку на StackPanel, это именно то, что я хочу, но, конечно, яне может получить к нему доступ в коде таким образом.

Я мог бы решить эту проблему, добавив обработчик MouseLeftButtonDown к каждому дочернему элементу StackPanel, сохранив тот, который был выбран последним, и затем получив его в обработчике ContextMenu, но это решение выглядит немного уродливо.Есть ли лучший способ сделать это?

Заранее спасибо за помощь!

1 Ответ

1 голос
/ 01 января 2011

Если вы произнесете sender как UIElement в обработчике событий щелчка, вы сможете получить все, что вам нужно, чтобы идентифицировать фактический элемент, по которому был выполнен клик.

(sender as UIElement).Property

Альтернативное приведениекак объект DependencyObject (если возможно) и использовать его для обхода визуального дерева:

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