Получить владельца контекстного меню в коде
У меня есть ContextMenu
:
<StackPanel Orientation="Horizontal">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Click="OnDeleteClicked" />
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
И мне нужно получить экземпляр StackPanel
, которому принадлежит ContextMenu
. Я уже пробовал это:
private void OnDeleteClicked(object sender, System.Windows.RoutedEventArgs e)
{
FrameworkElement parent = e.OriginalSource as FrameworkElement;
while (!(parent is StackPanel))
{
parent = (FrameworkElement)LogicalTreeHelper.GetParent(parent);
}
}
Но после получения родительского элемента ContextMenu
Popup он получает значение null, то же самое с VisualTreeHelper
, он получает значение null до получения StackPanel
. Любая идея о том, как это сделать?
Спасибо!
Ответы
Ответ 1
это даст вам то, что вы хотите
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;
}
}
Надеюсь, это поможет!
Ответ 2
Визуальное дерево для ContextMenus и Popups работает несколько иначе. Вы можете использовать ContextMenu.PlacementTarget
для получения StackPanel. В MSDN имеется более подробная информация: http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.placementtarget.aspx
Ответ 3
контекстное меню имеет собственное визуальное дерево, попробуйте вызвать это из обработчика событий следующим образом: -
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;
}