2009-12-10 73 views
22

我有一個ContextMenu這樣的:獲取上下文菜單的所有者代碼

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

,我需要獲得擁有該ContextMenuStackPanel的實例。我已經嘗試過這樣的:

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彈出父之後,它變得無效,同時與VisualTreeHelper,它就會獲得StackPanel之前爲null。任何想法如何做到這一點?

謝謝!

回答

1

上下文菜單中有自己的可視化樹,試試這個調用該從你的事件處理程序,如下所示: -

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

這會給你確切的事情,你想

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

希望這幫助!

相關問題