首页 > 解决方案 > 如何在打开事件中获取上下文菜单对象

问题描述

当上下文菜单打开时,我想用源代码管理的信息填充一个文本框,例如它的名称等,用于查看和编辑目的。

但是无论如何我都无法访问打开的上下文菜单。可能是因为我对控件的xaml风格了解较少。

以下是我的 xaml:

上下文菜单部分:我想在上下文菜单打开时填充文本框。

<ContextMenu x:Key="VacUnitContextMenu" >
    <MenuItem Header="Property">
        <MenuItem>
            <MenuItem.Header> 
                <StackPanel Orientation="Horizontal">
                    <Label Content="Name" />
                    <TextBox Width="60" Name="VacName" Margin="2,0" />
                </StackPanel>
            </MenuItem.Header>
        </MenuItem>
        <MenuItem Header="Get" Command="{x:Static s:DesignerCanvas.VacUnitNameGet}"/>
    </MenuItem>
    <MenuItem Header="X">
            <MenuItem Header="TEST" Command="{x:Static s:DesignerCanvas.XTest}">
                <MenuItem.Icon>
                    <Image Source="Images/SendToBack.png" Width="16"/>
                </MenuItem.Icon>
            </MenuItem>
    </MenuItem>
</ContextMenu>

上下文菜单以这种方式使用:

<!-- VacUnit Style -->
<Style TargetType="{x:Type s:VacUnit}"  >
    <Setter Property="MinWidth" Value="10"/>
    <Setter Property="MinHeight" Value="10"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type s:VacUnit}">
                <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                      ContextMenu="{StaticResource VacUnitContextMenu}"                              
                      >
                                            
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我使用 conextmenuopening 事件,并尝试在那里填充文本框, 如何:处理 ContextMenuOpening 事件

但我无法获得上下文菜单,它为空:

FrameworkElement fe = e.Source as FrameworkElement;
ContextMenu cm = fe.ContextMenu;

提前谢谢了。

标签: wpfwpf-controlscontextmenu

解决方案


可能e.Source不是Grid定义上下文菜单的地方。

您可以搜索父元素,直到找到上下文菜单所在的元素。

private void Xxx_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
    var fe = e.Source as FrameworkElement;
    var contextMenu = FindContextMenu(fe);
    if(contextMenu != null)
    {
        // your code
    }
}

// helper
private ContextMenu FindContextMenu(FrameworkElement fe)
{
    if(fe == null)
    {
        return null;
    }
    if(fe.ContextMenu != null)
    {
        return fe.ContextMenu;
    }
    else
    {
        var parent = VisualTreeHelper.GetParent(fe) as FrameworkElement;
        return FindContextMenu(parent);
    }
}

推荐阅读