I have a ContextMenu
like this:
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;
}
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!!
The visual tree for ContextMenus and Popups works a little differently. You can use ContextMenu.PlacementTarget
to get the StackPanel. There is more information available on MSDN here: http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.placementtarget.aspx