2009-12-10 7 views
22

Ich habe eine ContextMenu wie folgt aus:Holen Besitzer Kontextmenü im Code

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

Und ich brauche, um die Instanz des StackPanel zu erhalten, dass ContextMenu besitzt. Ich habe bereits versucht dies:

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

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

aber nach dem ContextMenu Popup Eltern bekommen, wird es null, das gleiche mit dem VisualTreeHelper, es wird vor auf null die StackPanel bekommen. Irgendeine Idee, wie man das macht?

Danke!

Antwort

1

das Kontextmenü einen eigenen visuellen Struktur hat, versuchen Sie dies wie so diese von Ihrem Event-Handler-Aufruf: -

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

dies wird Ihnen die genaue, was Sie wollen

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 Diese hilft !!

Verwandte Themen