2009-12-10 3 views
22

でコンテキストメニューの所有者を取得します。私はこのようContextMenuありますコード

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

をそして私はContextMenuことを所有しているStackPanelのインスタンスを取得する必要があります。私はすでにこの試みた:

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ポップアップの親を取得した後、それがnullの取得、VisualTreeHelperと同じ、それはStackPanelを取得する前にnullになります。どのようにこれを行う上の任意のアイデア?

ありがとうございます!これはあなたが望む正確なもの

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

希望これを与える

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

答えて

1

コンテキストメニューは、独自のビジュアルツリーを持っている、これがそうのようなあなたのイベントハンドラからこれを呼び出してみてください助けて!