在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件
来源:互联网 发布:windows在哪下载 编辑:程序博客网 时间:2024/05/01 14:57
WPF的ContextMenu没有类似WinForm里面ContextMenu.SourceControl的概念,但是你可以通过ContextMenuService的GetPlacementTarget方法来获取类似的效果。
很多时候,我们会希望在WPF的资源文件里面定义一个通用的右键弹出菜单,然后将这个菜单通过定义在各个控件的ContextMenu属性来设置用户右击控件时弹出菜单。然而因为WPF的一些设计不足,你不能在右键菜单的点击事件处理函数中获知右键菜单弹出时,鼠标的焦点是在哪个控件上? 例如下面的代码:
XAML代码:
<Window.Resources>
<ContextMenu x:Key="sampleContextMenu">
<MenuItem Header="MenuItem1" Click="WhoBringMeOut" />
</ContextMenu>
...
</Window.Resources>
<TreeView>
<TreeViewItem Header="TreeViewItem1" ContextMenu="{StaticResource sampleContextMenu}" />
<TreeViewItem Header="TreeViewItem2" ContextMenu="{StaticResource sampleContextMenu}" />
<TreeViewItem Header="TreeViewItem3"/>
</TreeView>
<DockPanel ContextMenu="{StaticResource sampleContextMenu}" >
<Image Source="img1.ico" />
<TextBlock Text="QuicklyAccess" />
</DockPanel>
C#代码:
public void WhoBringMeOut(object sender, RoutedEventArgs e)
{
// sender的值是被点击的MenuItem,而不是触发右键菜单
// 弹出的控件,例如TreeViewItem,或者是DockPanel
}
这种情况下你可以通过ContextMenuService的GetPlacementTarget方法来获取类似的效果。
然而,看起来WPF在MenuItem.Click事件处理上面有一点bug,就是你不能通过(sender as MenuItem).ContextMenu
获取到点击的右键菜单,只好求助于LogicalTreeHelper.GetParent方法了,
使用下面的方法获取到ContextMenu的Owner:
ContextMenuService.GetPlacementTarget(LogicalTreeHelper.GetParent(sender as MenuItem))
也就是说上面的C#代码改成下面的样子就可以了:
public void WhoBringMeOut(object sender, RoutedEventArgs e)
{
ContextMenuService.GetPlacementTarget(
LogicalTreeHelper.GetParent(sender as MenuItem));
}
- 在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件
- 在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件
- contextmenu用法-实现鼠标右键点击菜单功能
- WPF中的右键菜单ContextMenu
- JTable中点击鼠标右键弹出菜单
- Jquery鼠标右键点击弹出菜单
- MFC(对话框鼠标右键弹出菜单)
- WPF中鼠标左键单击Button弹出ContextMenu,让其右键ContextMenu失效
- VC鼠标右键弹出菜单的实现(转)
- 在SWTBot中触发右键菜单(ContextMenu)
- WPF NotifyIcon ContextMenu 右键菜单 样式Style
- wpf listview 的右键菜单 点击事件
- VC鼠标右键弹出菜单的实现
- VC鼠标右键弹出菜单的实现
- 鼠标右键弹出快捷菜单的实现
- C#获取鼠标在listview右键点击单元格的内容
- ContextMenu文本菜单(右键菜单)、SubMenu子菜单
- WPF 左键单击弹出菜单 ContextMenu
- 通用用户权限系统设计
- Delphi7下安装Ehlib 4.3
- Talk:OpenGL GUI Framework
- 感悟javascript(我的学习历程)
- What GUI system to use for C++/Ogre MMOG?
- 在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件
- 自做asp与AJAX之投票系统
- 堆和栈的区别
- DELPHI+MSSQL工业控制之数据采集系统(毕业论文+文献综述+外文翻译+可执行程序+源代码)
- 使用CAST来SQL注入
- Flex中 encodeURI 对url进行编码,中文url
- 还是,Stairway To Haven
- 练手小项目(二):计算器(说明文档)
- 练手小项目(二)计算器