wpf - 如何在打开事件中获取上下文菜单对象
问题描述
当上下文菜单打开时,我想用源代码管理的信息填充一个文本框,例如它的名称等,用于查看和编辑目的。
但是无论如何我都无法访问打开的上下文菜单。可能是因为我对控件的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;
提前谢谢了。
婷
解决方案
可能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);
}
}
推荐阅读
- python - Python 嵌套字典和嵌套更新
- python - 如何在返回消息中获取新创建用户的名称?
- xamarin - 当我尝试上传带口罩的图像时,认知面部检测不起作用
- java - 如何强制java显示完整的堆栈跟踪
- mongodb - 使用 Homebrew 安装 mongodb-community 时出错
- javascript - JavaScript addEventListener() 外部函数在没有事件的情况下触发
- database - 数据库、数据集市、数据仓库、数据湖
- javascript - 数据集返回未定义(不在控制台中)
- javascript - 滚动时未触发 JavaScript 事件
- lisp - elisp 中的 Y 组合器