2009-12-10 12 views
22

Mam ContextMenu takiego:Get właściciela menu kontekstowego w kodzie

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

I trzeba uzyskać instancję StackPanel, która jest właścicielem, że ContextMenu. Ja już próbowałem:

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

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

Ale po uzyskaniu ContextMenu Popup rodziców, robi się pusty, samo z VisualTreeHelper, robi null przed uzyskaniem StackPanel. Masz pomysł, jak to zrobić?

Dzięki!

Odpowiedz

1

menu kontekstowe posiada własne drzewo wizualne, spróbuj tego nazywając to z obsługi zdarzeń tak: -

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; 
    } 
48

to daje dokładny rzeczą, którą chcesz

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; 
    } 
} 

nadzieję, że ten pomaga!

Powiązane problemy