31

私は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);
    }
}

しかし、ContextMenuPopup の親を取得した後、 と同じVisualTreeHelperように null になり、 を取得する前に null になりますStackPanel。これを行う方法について何か考えはありますか?

ありがとう!

4

3 に答える 3

63

これにより、あなたが望む正確なものが得られます

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

お役に立てれば!!

于 2009-12-11T07:25:30.137 に答える
9

ContextMenus と Popups のビジュアル ツリーの動作は少し異なります。ContextMenu.PlacementTargetStackPanel を取得するために使用できます。詳細については、MSDN で入手できます: http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.placementtarget.aspx

于 2012-02-09T19:10:12.693 に答える
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;
  }
于 2009-12-11T01:03:50.540 に答える