でコンテキストメニューの所有者を取得します。私はこのよう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;
}