tags:

views:

82

answers:

2

Hi, I have a context menu like this:

<StackPanel Orientation="Horizontal">
    <StackPanel.ContextMenu>
     <ContextMenu>
      <MenuItem Header="Delete" Click="OnDeleteClicked" />
        </ContextMenu>
    </StackPanel.ContextMenu>
</StackPanel>

And I need to get the instance of the StackPanel that owns that ContextMenu. I already tried this:

private void OnDeleteClicked(object sender, System.Windows.RoutedEventArgs e)
{
    FrameworkElement parent = e.OriginalSource as FrameworkElement;

    while (!(parent is StackPanel))
    {    
     parent = (FrameworkElement)LogicalTreeHelper.GetParent(parent);
    }
}

But after getting the ContextMenu Popup parent, it gets null, same with the VisualTreeHelper, it gets to null before getting the StackPanel. Any idea on how to do this?

Thanks!

A: 

the context menu has its own visual tree, try this calling this from your event handler like so :-

StackPanel stackPanel = GetStackPanelItemFromContextMenu((FrameworkElement)sender, yourStackPanel);

  private StackPanel GetStackPanelItemFromContextMenu(FrameworkElement sender, StackPanel stackPanel) {
     Point menuClickPoint = ((sender as FrameworkElement).Parent as ContextMenu).TranslatePoint(new Point(0, 0), stackPanel);

     // get the first potential object that was hit   
     DependencyObject obj = stackPanel.InputHitTest(menuClickPoint) as DependencyObject;

     // cycle up the tree until you hit the StackPanel
     while (obj != null && !(obj is StackPanel)) {
        obj = VisualTreeHelper.GetParent(obj);
     }

     return obj as StackPanel;
  }
Aran Mulholland
+1  A: 

this will give you the exact thing you want

private void OnDeleteClicked(object sender, System.Windows.RoutedEventArgs e)
{
    MenuItem mnu = sender as MenuItem;
    StackPanel sp = null;
    if(mnu!=null)
    {
        sp = ((ContextMenu)mnu.Parent).PlacementTarget as StackPanel;
    }
}

Hope this helps!!

viky