在WPF的TreeView中实现右键选定

在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该节点,以使得菜单针对选中的节点生效。

    

图1:虽然是在GNU节点上弹出的右键菜单,但选中的节点仍然是上次左键单击的DOC节点。
图2:弹出的右键菜单同时选中GNU节点才是我们所需要的效果

实现这个功能并不是很难,我最开始的做法就是目前网上流行的版本:

  1. 在TreeViewItem中响应PreviewMouseRightButtonDown事件
  2. 在响应右键单击事件前选中sender(TreeViewItem)节点。

private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    var treeViewItem = sender as TreeViewItem;
    if (treeViewItem != null)
    {
        treeViewItem.Focus();
        e.Handled = true;
    }
}

但这样做还存在一个问题:当选择子节点时,sender并不是子节点的TreeViewItem,而是其父节点。导致无法选择选择子节点。如下图所示:

  

要解决这个问题也不难,那就是根据MouseButtonEventArgsOriginalSource来获取节点。但是OriginalSource也不是TreeViewItem,而是产生鼠标事件的子控件,因此还得往上查找,从而找到所属的TreeViewItem。

最终的解决方案如下:

1. 在TreeViewItem中响应PreviewMouseRightButtonDown事件

<TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
        <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
    </Style>
</TreeView.ItemContainerStyle>

2. 在响应右键单击事件前选中TreeViewItem节点。

private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    var treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
    if (treeViewItem != null)
    {
        treeViewItem.Focus();
        e.Handled = true;
    }
}

static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
{
    while (source != null && source.GetType() != typeof(T))
        source = VisualTreeHelper.GetParent(source);

    return source;
}

现在才是一个比较完美的解决方案。  

转载于:https://www.cnblogs.com/TianFang/archive/2010/02/10/1667153.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 音频处理库 pico.js

pico.js 实现了实时音频处理的简单 JavaScript 接口。 示例代码&#xff1a; 转载于:https://www.cnblogs.com/shihao/archive/2012/12/08/2809084.html

[转载]项目风险管理七种武器-霸王枪

“小帅&#xff0c;老大对你的项目很关注&#xff0c;听说又拍了新需求&#xff1f;”度教授说道。 “对&#xff0c;不过我已经用离别钩处理了。” “那可能不够&#xff0c;你的项目已经到后期&#xff0c;现在进行需求变更&#xff0c;可能引入巨大的质量风险&#xff0c;这…

python编程入门第一课_python入门前的第一课 python怎样入门

人工智能时代的到来&#xff0c;很多文章说这么一句&#xff1a;“不会python&#xff0c;就不要说自己是程序员”&#xff0c;这说的有点夸张了&#xff0c;但确实觉得目前python这个语言值得学习&#xff0c;而且会python是高薪程序员的必备技能。很多初学Python的同学都面临…

破站www.2637.cn居然敢截持偶的IE!

网上也有很多人中招了&#xff0c;连主页都被改了做http://www.2637.cn/?gba&#xff0c;杀毒后哪个网址还在哪强占做主页&#xff01;重装IE也试过但还是换不到主页&#xff01;可谓是比较顽固的。 偶痛恨的同时&#xff0c;也对其原理有了一些兴趣。这个死东西还不可以被360…

php熊掌号怎么设置json-ld,dedecms织梦系统怎么对接百度熊掌号并添加JSON_LD数据

dedecms织梦系统怎么对接百度熊掌号并添加JSON_LD数据&#xff1f;百度推出的百度熊掌号非常的不错,我的dedecms织梦系统早早就对接好了,它能对你的原创文章进行原创保护,并评出熊掌号搜索指数,熊掌号搜索指数是对你文章的内容质量,用户喜爱、原创能力、活跃表现、领域专注五个…

Java并发编程:volatile关键字解析

2019独角兽企业重金招聘Python工程师标准>>> volatile这个关键字可能很多朋友都听说过&#xff0c;或许也都用过。在Java 5之前&#xff0c;它是一个备受争议的关键字&#xff0c;因为在程序中使用它往往会导致出人意料的结果。在Java 5之后&#xff0c;volatile关键…

php 掌握jquery,完全掌握jquery tmpl模板

之前用模板渲染都是用angular&#xff0c;无意间发现了jquery tmpl这种轻量级&#xff0c;其文档在这里&#xff0c;本文主要为大家带来一篇jquery tmpl模板(实例讲解)。小编觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧&am…

uniaccess进程无法结束 拒绝访问_嵌入式Linux编程——程序员小白不懂的进程、信号量、并发、互斥...

所有学嵌入式Linux系统的看过来了&#xff0c;以下内容是每一位想学习Linux嵌入式系统想要了解的内容&#xff0c;真的很想要分享给大家&#xff01;本文分享的内容主要如下几个方面&#xff1a;3.1 并发的原理3.1.1 一个简单的例子3.1.2 竞争条件3.1.3 操作系统关注的问题3.1.…

我常用的在线取色器

颜色明淡 http://www.colorschemer.com/online.html 2.http://tool.cc/color/ 转载于:https://www.cnblogs.com/xiaoliu66007/p/5145955.html

python支持向量机回归_Python中支持向量机SVM的使用方法详解

除了在Matlab中使用PRTools工具箱中的svm算法&#xff0c;Python中一样可以使用支持向量机做分类。因为Python中的sklearn库也集成了SVM算法&#xff0c;本文的运行环境是Pycharm。 一、导入sklearn算法包 Scikit-Learn库已经实现了所有基本机器学习的算法&#xff0c;具体使用…

linux awk命令详解

简介 awk是一个强大的文本分析工具&#xff0c;相对于grep的查找&#xff0c;sed的编辑&#xff0c;awk在其对数据分析并生成报告时&#xff0c;显得尤为强大。简单来说awk就是把文件逐行的读入&#xff0c;以空格为默认分隔符将每行切片&#xff0c;切开的部分再进行各种分析处…

解决了界面上菜单项跑到其它AE控件后面的问题(java)

菜单项竟然跑到后面去了&#xff0c;搞了好多天&#xff0c;终于解决了 只要把这句代码放到main()的最前面就可以了 JPopupMenu.setDefaultLightWeightPopupEnabled(false); 转载于:https://www.cnblogs.com/bluemaplestudio/archive/2010/02/28/1675171.html

matlab利用霍夫,基于matlab的霍夫变换

霍夫变换(限量版)基于matlab的霍夫变换 一、简单介绍Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性&#xff0c;将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问…

python网站用什么数据库_PyMySQL数据库的使用

前面我们学习了SQLite数据库的相关内容&#xff0c;我们也通过前面的内容学习到了数据库的相关操作&#xff0c;PyMySQL数据库的操作和前面的内容类似&#xff0c;但我们可以通过Navicat直接来查看数据库中的内容&#xff0c;实现数据可视化&#xff0c;前面我们已经完成了下载…

宏与内联(inline)的区别(转载)

先转载下人家总结的宏和普通函数调用的区别&#xff1a;(1)、宏只做简单的字符串替换&#xff0c;函数是参数传递&#xff0c;所以必然有参数类型检查(支持各种类型&#xff0c;而不是只有字符串)。(2)、宏不经计算而直接替换参数&#xff0c;函数调用则是将参数表达式求值再传…

web 服务器 内存 影响_高性能服务器架构思路「不仅是思路」

在服务器端程序开发领域&#xff0c;性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而&#xff0c;服务器端程序在性能问题上应该有何种基本思路&#xff0c;这个却很少被这些项目的文档提及。本文正式希望介绍服务器端解决性能问…

100~200之间的素数(及其四个优化方案)

要求素数&#xff0c;首先我们要知道什么是素数&#xff0c;在解题的时候&#xff0c;不要急着去寻找方法解题&#xff0c;而是要先了解它的根本&#xff0c;才可以在遇到类似题的时候轻松面对解决质数(prime number)又称素数&#xff0c;有无限个。一个大于1的自然数&#xff…

php项目安装器,php服务器环境安装及项目搭建

2安装运行环境及搭建项目2.1安装apache及测试1)安装apacheyum install httpd启动apachesystemctl start httpd.service查看运行状态systemctl status httpd.service2)编辑测试页面echo “xingming”>/var/www/html/index.html3)打开浏览器输入公网ip地址&#xff0c;结果如下…

单链表删除所有值为x的元素_线性表之单链表

单链表一种以链接方式存储的线性表&#xff0c;适用于频繁增删操作&#xff0c;存储空间不定的情形。单链表的一个存储结点包含两个域&#xff0c;数据域和指针域。数据域用于存储线性表的一个数据元素&#xff0c;指针域用于指示下一个结点开始的存储地址。链表第一个结点的地…

PHP自动测试框架Top 10

2019独角兽企业重金招聘Python工程师标准>>> 对于很多PHP开发新手来说&#xff0c;测试自己编写的代码是一个非常棘手的问题。如果出现问题&#xff0c;他们将不知道下一步该怎么做。花费很长的时间调试PHP代码是一个非常不明智的选择&#xff0c;最好的方法就是在编…