在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件

WPF的ContextMenu没有类似WinForm里面ContextMenu.SourceControl的概念,但是你可以通过ContextMenuService的GetPlacementTarget方法来获取类似的效果。

 

很多时候,我们会希望在WPF的资源文件里面定义一个通用的右键弹出菜单,然后将这个菜单通过定义在各个控件的ContextMenu属性来设置用户右击控件时弹出菜单。然而因为WPF的一些设计不足,你不能在右键菜单的点击事件处理函数中获知右键菜单弹出时,鼠标的焦点是在哪个控件上? 例如下面的代码:


<</span>Window.Resources>

    <</span>ContextMenu x:Key="sampleContextMenu">

        <</span>MenuItem Header="MenuItem1" Click="WhoBringMeOut" />

    </</span>ContextMenu>

    ...

</</span>Window.Resources>

 

<</span>TreeView>

    <</span>TreeViewItem Header="TreeViewItem1" ContextMenu="{StaticResource sampleContextMenu}" />

    <</span>TreeViewItem Header="TreeViewItem2" ContextMenu="{StaticResource sampleContextMenu}" />

    <</span>TreeViewItem Header="TreeViewItem3"/>

</</span>TreeView>

 

<</span>DockPanel ContextMenu="{StaticResource sampleContextMenu}" >

    <</span>Image Source="img1.ico" />

    <</span>TextBlock Text="QuicklyAccess" />

</</span>DockPanel> 

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

    }



  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值