WPF弹出右键菜单时判断鼠标是否选中该项

和上篇在WPF的TreeView中实现右键选定一样,这仍然是一个右键菜单的问题:

这个需求是在一个实现剪贴板的功能的时候遇到的:在弹出右键菜单时,如果菜单弹出位置在ListViewItem中时,我们认为这项已经被选中,可以使用剪贴板功能。

当菜单弹出位置在ListView的空白处时,我们一般认为没有项被选中,此时是不应该使能剪贴板功能的。

但是这个时候,该项仍然是选中的。不能通过Item的IsSelected的属性来区分这两种情况。这样,就需要我们加一个判断鼠标是否在所选的节点上的函数。实现这个功能的方式有如下两种:

方法1:响应ListView的PreviewMouseRightButtonDown事件,在其中判断是否有节点被选中。还是直接上代码吧:

    bool isItemSelected = false;
    private void ListView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        object item = GetElementFromPoint((ItemsControl)sender, e.GetPosition((ItemsControl)sender));
        isItemSelected = (item != null);
    }

    private object GetElementFromPoint(ItemsControl itemsControl, Point point)
    {
        UIElement element = itemsControl.InputHitTest(point) as UIElement;
        while (element != null)
        {
            if (element == itemsControl)
                return null;
            object item = itemsControl.ItemContainerGenerator.ItemFromContainer(element);
            if (!item.Equals(DependencyProperty.UnsetValue))
                return item;
            element = (UIElement)VisualTreeHelper.GetParent(element);
        }
        return null;
    }

这个其实就是一个命中测试的方面的问题,代码还是比较基础的,也没有什么需要解释的地方,但写起来还是有点麻烦。

方法2:同时响应ListView的PreviewMouseRightButtonDown事件和TreeViewItem的PreviewMouseRightButtonDown事件。

  • 当鼠标点击在ListViewItem上时:发生的事件顺序为 ListView_MouseDown 、ListViewItem_MouseDown。
  • 当鼠标点击在ListView外时:发生的事件仅为 ListView_MouseDown 。

因此,只要在ListView_MouseDown 中设置isItemSelected = false,在ListViewItem_MouseDown中设置isItemSelected = true即可。由于非常简单,就不附代码了。

使用上面的两种方法后,就可以直接在剪切复制命令的CanExecute函数中通过isItemSelected来判断是否该使能剪切复制命令了。

另外,这两方法是针对ItemsControl类型的控件的,也就是说,在TreeView或ListBox等控件中也可以使用,如果把它们封装一下就更方便了。

到此这篇关于WPF弹出右键菜单时判断鼠标是否选中该项的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • WPF数据驱动修改绑定

    一.简介 在XAML文件中我们创建了一个TextBlock 和一个Slider.2个控件.我们把TextBlock的Text属性(用于显示文本的属性)设置为{Binding Intelligence}.把Slider的Value属性(滑块的当前值)设置为{Binding Intelligence}. 二.代码案例 XMAL: <Grid> <StackPanel> <TextBlock Text="{Binding Intelligence}"/>

  • 对WPF中的TreeView实现右键选定

    在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的.当我们想在TreeViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该节点,以使得菜单针对选中的节点生效. 图1:虽然是在GNU节点上弹出的右键菜单,但选中的节点仍然是上次左键单击的DOC节点.图2:弹出的右键菜单同时选中GNU节点才是我们所需要的效果 实现这个功能并不是很难,我最开始的做法就是目前网上流行的版本: 在TreeViewItem中响应PreviewMouseRigh

  • WPF中图像处理的方法介绍

    和Winform中的GDI+相比,WPF提供了一组新的API用于显示和编辑图像.新API特点如下: 适用于新的或专用图像格式的扩展性模型. 对包括位图 (BMP).联合图像专家组 (JPEG).可移植网络图形 (PNG).标记图像文件格式 (TIFF).Microsoft Windows Media 照片.图形交换格式 (GIF) 和图标 (.ico) 在内的本机图像格式增强了性能和安全性. 高位深图像数据的保留最多 32 位/通道. 非破坏性图像缩放.裁切和旋转. 简化的颜色管理 支持文件内的

  • WPF中TreeView控件的用法

    在WPF的TreeView使用方式和WinForm下有很大不同,那些展开某节点.获取父节点,判断某节点是否被选中等常用的操作在WinForm下都有相关函数,而在WPF中却不能轻易实现. 一种常规的方式是通过MVVM模式来将TreeViewItem节点中的IsSelect,IsExpanded等属性来双向绑定到要显示的节点数据中,然后直接通过节点数据的属性来实现相关操作. 但是,有的时候,当我们没有ViewModel层,但又想像WinFrom那样直接简单的获取或设置这些属性的时候,该如何办呢.其实

  • C#对WPF数据绑定的菜单插入分隔Seperator

    WPF代码展示 <Window.Resources> <local:Source x:Key="src"/> </Window.Resources> <StackPanel> <Menu> <MenuItem Header="Animals" ItemsSource="{Binding Source={StaticResource src}}" /> </Menu>

  • C# WPF后台动态添加控件实战教程

    目录 概述 ​项目介绍 代码设计 源码 总结 概述 在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本节举例介绍这个问题. 这里要用到UniformGrid布局,UniformGrid 是一种横向的网格分割.纵向的网格分割分别是均等的分割的布局类型. ​项目介绍 -. 这里界面添加一个ComboBox用来下拉选择图片数量: -. 添加一个button用来执行图片显示: dispaly下方是图片显示区域 代码设计

  • C#自定义WPF中Slider的Autotooltip模板

    Slider控件有一个我比较喜欢的属性"AutoToolTip",可以在拖动的过程中显示当前刻度,然而这个刻度却不支持模板定制,并且就连自定义格式也不行.这就大大的限制了它的使用范围.网上有篇文章解决了这个问题,可以实现自定义显示格式 代码如下: /// <summary> /// A Slider which provides a way to modify the /// auto tooltip text by using a format string. /// &

  • WPF弹出右键菜单时判断鼠标是否选中该项

    和上篇在WPF的TreeView中实现右键选定一样,这仍然是一个右键菜单的问题: 这个需求是在一个实现剪贴板的功能的时候遇到的:在弹出右键菜单时,如果菜单弹出位置在ListViewItem中时,我们认为这项已经被选中,可以使用剪贴板功能. 当菜单弹出位置在ListView的空白处时,我们一般认为没有项被选中,此时是不应该使能剪贴板功能的. 但是这个时候,该项仍然是选中的.不能通过Item的IsSelected的属性来区分这两种情况.这样,就需要我们加一个判断鼠标是否在所选的节点上的函数.实现这个

  • 使用contextMenu插件实现Bootstrap table弹出右键菜单

    如今Bootstrap这个前端框架已被许多人接受并应用在不同的项目中,其中"开发高效,设备兼容"的特点表现得非常明显.再加上它默认的美观的UI组件,简直就是很多前端的大爱啊!!! 今天在这里跟大家分享Bootstrap table弹出右键菜单的实现方法. 最近遇到有一个需求,需要在Bootstrap table上使用右键.网上搜了半天没有找到,最后发现Bootstrap table不支持右键(官方文档给出的答案 https://github.com/wenzhixin/bootstra

  • 微信浏览器弹出框滑动时页面跟着滑动的实现代码(兼容Android和IOS端)

    在做微信开发的时候遇到这个问题:微信浏览器弹出框滑动时页面跟着滑动. 我觉得这个问题用的是下面这几行代码: var $body = $('body'), dialogIsInView = !1,//当前是不是对话框 lastContentContainerScrollTop = -1,//用于弹出框禁止内容滚动 $contentContainer = $('#content-container');//内容容器 //阻止Window滚动 function stopWindowScroll() {

  • Android实现底部弹出按钮菜单升级版

    本文实例为大家分享了Android实现底部弹出按钮菜单的具体代码,在Android实现底部缓慢弹出菜单的升级,供大家参考,具体内容如下 只贴出关键代码 case R.id.myself_share: //我的分享 getShareMune(); getShareMune() private void getShareMune() { final Dialog mdialog = new Dialog(getActivity(), R.style.photo_dialog); mdialog.se

  • Android组件实现长按弹出上下文菜单功能的方法

    本文实例讲述了Android组件实现长按弹出上下文菜单功能的方法.分享给大家供大家参考,具体如下: 简单组件长按弹出上下文菜单总结 第一步:在程序合适位置给一个控件注册上下文菜单 组件可以是按钮,文本框,还可以是列表条目,下以listView列表为例 ListView contentList=(ListView) findViewById(R.id.blackname_manager_listV); contentList.setAdapter(mListAdapter); registerFo

  • 微信小程序实现action-sheet弹出底部菜单功能【附源码下载】

    本文实例讲述了微信小程序实现action-sheet弹出底部菜单功能.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 ① index.wxml <button type="default" bindtap="actionSheetTap">弹出action sheet</button> <action-sheet hidden="{{actionSheetHidden}}" bindchange=&qu

  • 百度地图给map添加右键菜单(判断是否为marker)

    废话不多说了,直接给大家贴代码了. js: var s;//经度 var w;//纬度 map.addEventListener("rightclick",function(e){ if(e.overlay){//判断右键单击的是否是marker }else{ s = e.point.lng;//经度 w = e.point.lat;//维度 RightClick();//右键单击map出现右键菜单事件 } }); //右键单击map出现右键菜单事件 function RightCli

  • WPF弹出带蒙板的消息框

    先看看效果图 思路 拿到父级窗体的内容,放入一个容器里,再在容器里放入一个半透明层.将整个容器赋给父级窗体的内容. 关闭时反向操作. 代码 消息窗弹出时 /// <summary> /// 弹出消息框 /// </summary> /// <param name="message">消息</param> /// <param name="owner">父级窗体</param> public st

  • Android 关机弹出选择菜单的深入解析

    在Android系统中,长按Power键默认会弹出对话框让你选择"飞行模式","静音","关机"等功能.这些功能对于手机非常适用,但是对于机顶盒产品就没有什么必要了.本文简单介绍一下怎样定制关机界面.我的目标是长按Power键,将会关机,弹出"设备将要关机"选择对话框.如果可以选择"是"关机,和"否"返回系统.弹出对话框的代码位于:frameworks\policies\base\pho

  • javascript轻松实现当鼠标移开时已弹出子菜单自动消失

    复制代码 代码如下: <html> <head> <style type="text/css"> .menu { background-color:green; width:120; height:20; color: white; text-align: center; font-size:9pt; font-weight:bolder; } .submenu { position:absolute; top:40; background-colo

随机推荐