对WPF中的TreeView实现右键选定
在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该节点,以使得菜单针对选中的节点生效。
图1:虽然是在GNU节点上弹出的右键菜单,但选中的节点仍然是上次左键单击的DOC节点。
图2:弹出的右键菜单同时选中GNU节点才是我们所需要的效果
实现这个功能并不是很难,我最开始的做法就是目前网上流行的版本:
- 在TreeViewItem中响应PreviewMouseRightButtonDown事件
- 在响应右键单击事件前选中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,而是其父节点。导致无法选择选择子节点。如下图所示:
要解决这个问题也不难,那就是根据MouseButtonEventArgs的OriginalSource来获取节点。但是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; }
现在才是一个比较完美的解决方案。
到此这篇关于WPF实现右键选定TreeView的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
WPF中图像处理的方法介绍
和Winform中的GDI+相比,WPF提供了一组新的API用于显示和编辑图像.新API特点如下: 适用于新的或专用图像格式的扩展性模型. 对包括位图 (BMP).联合图像专家组 (JPEG).可移植网络图形 (PNG).标记图像文件格式 (TIFF).Microsoft Windows Media 照片.图形交换格式 (GIF) 和图标 (.ico) 在内的本机图像格式增强了性能和安全性. 高位深图像数据的保留最多 32 位/通道. 非破坏性图像缩放.裁切和旋转. 简化的颜色管理 支持文件内的
-
WPF数据驱动修改绑定
一.简介 在XAML文件中我们创建了一个TextBlock 和一个Slider.2个控件.我们把TextBlock的Text属性(用于显示文本的属性)设置为{Binding Intelligence}.把Slider的Value属性(滑块的当前值)设置为{Binding Intelligence}. 二.代码案例 XMAL: <Grid> <StackPanel> <TextBlock Text="{Binding Intelligence}"/>
-
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中Slider的Autotooltip模板
Slider控件有一个我比较喜欢的属性"AutoToolTip",可以在拖动的过程中显示当前刻度,然而这个刻度却不支持模板定制,并且就连自定义格式也不行.这就大大的限制了它的使用范围.网上有篇文章解决了这个问题,可以实现自定义显示格式 代码如下: /// <summary> /// A Slider which provides a way to modify the /// auto tooltip text by using a format string. /// &
-
WPF使用VisualTreeHelper进行命中测试
一.简介 我们有时候又需求从当前视觉树中找一些东西,比如鼠标按下的时候,看看鼠标下的元素都有什么.又比如某块区域下有哪些元素?某个坐标点下有哪些元素?这些需求在使用 命中测试的时候,可以非常方便和快速的去找到我们需要的内容. 二.代码案例 我在一个画板上在不同的位置放了3个圆形.给他们放置了不同的位置和填充不同的颜色,我们通过命中测试判断如果鼠标在圆上抬起了,我们读取当前圆的填充颜色. XAML: <Grid MouseLeftButtonUp="Grid_MouseLeftButtonU
-
.NET Windbg分析某妇产医院WPF内存溢出
目录 一:背景 1. 讲故事 二:Windbg 分析 1. 为什么会内存溢出 2. 探索溢出原因 3. 如何突破 2G 限制 三:总结 一:背景 1. 讲故事 上个月有位朋友找到我,说他的程序存在内存溢出情况,寻求如何解决. 要解决还得通过 windbg 分析啦. 二:Windbg 分析 1. 为什么会内存溢出 大家都知道内存溢出对应着 .NET 中的 OutOfMemoryException 异常,这种异常有可能是托管代码手工抛出的,也有可能是CLR层面抛出的,言外之意就是可以通过两种方式排查
-
C# WPF后台动态添加控件实战教程
目录 概述 项目介绍 代码设计 源码 总结 概述 在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本节举例介绍这个问题. 这里要用到UniformGrid布局,UniformGrid 是一种横向的网格分割.纵向的网格分割分别是均等的分割的布局类型. 项目介绍 -. 这里界面添加一个ComboBox用来下拉选择图片数量: -. 添加一个button用来执行图片显示: dispaly下方是图片显示区域 代码设计
-
WPF数据绑定中的RelativeSource属性
一.简介 一个在Binding中比较重要的知识点——RelativeSource. 使用RelativeSource对象指向源对象.用这个可以在当前元素的基础上查找其他对象用于绑定到源对象.在实际使用Binding的过程中大部分时间Binding都放在了数据模板和控件模板中,(数据模板是控件模板用于定义控件的UI). 在模板中编写Binding时有时候无法直接拿到我们需要绑定的数据对象,我们不能确定我们需要的Source对象叫什么,但是我们直到了我们需要使用的对象在UI布局上的相对关系.比如控件
-
对WPF中的TreeView实现右键选定
在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的.当我们想在TreeViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该节点,以使得菜单针对选中的节点生效. 图1:虽然是在GNU节点上弹出的右键菜单,但选中的节点仍然是上次左键单击的DOC节点.图2:弹出的右键菜单同时选中GNU节点才是我们所需要的效果 实现这个功能并不是很难,我最开始的做法就是目前网上流行的版本: 在TreeViewItem中响应PreviewMouseRigh
-
c# WPF中的TreeView使用详解
在wpf中实现treeview的功能,可能看到很多分享的都是简单的绑定,仅此记录自己完成的功能. 前台 <TreeView x:Name="chapterTree" Grid.Column="0" SelectedItemChanged="chapterTree_SelectedItemChanged" PreviewMouseRightButtonDown="chapterTree_PreviewMouseRightButton
-
WPF中TreeView控件的用法
在WPF的TreeView使用方式和WinForm下有很大不同,那些展开某节点.获取父节点,判断某节点是否被选中等常用的操作在WinForm下都有相关函数,而在WPF中却不能轻易实现. 一种常规的方式是通过MVVM模式来将TreeViewItem节点中的IsSelect,IsExpanded等属性来双向绑定到要显示的节点数据中,然后直接通过节点数据的属性来实现相关操作. 但是,有的时候,当我们没有ViewModel层,但又想像WinFrom那样直接简单的获取或设置这些属性的时候,该如何办呢.其实
-
WPF中引入WindowsForms控件的方法
本文实例讲述了WPF中引入WindowsForms控件的方法.分享给大家供大家参考,具体如下: 环境: [1]WindowsXP with SP3 [2]VS2008 with SP1 正文: Step1:在现有工程中引入Windows Forms 鼠标右键[References]->选择[Add Reference]->[.NET]标签页 加入[WindowsFormsIntegration]和[System.Windows.Forms]两项 Step2:在XAML文件里加入 [S2-1]加
-
通过App.xaml理解wpf中的Application类
这个章节来了解Application类,我考虑了一晚上决定跳过控件类相关的学习,因为控件如果只是入门的话每个控件F12跳过去看一下属性.事件就能大致了解的差不多,而且控件比较多,每个都这样看一遍,感觉意义不大.同时控件的使用一般又同时包含了,资源.样式.触发器.模板.绑定.列表控件的话,可能还包含列表虚拟化和数据虚拟化.所以想了一下.打算先讲Application类. 教程的第一篇我们从hello world开始了解什么是程序.它是如何编译.生成和运行的.现在这一个篇从App.xaml讲解App
-
详解WPF中的对象资源
在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源. 这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集中),这个是资源是我们想在公共的地方写一个对象让其他元素重复使用. 先贴个例子: <Window x:Class="NETResource.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pre
-
WPF中button按钮同时点击多次触发click解决方法
解决WPF中button按钮同时点击多次触发click的方法,供大家参考,具体内容如下 DateTime lastClick = DateTime.Now; object obj = new object(); int i = 0; private void Button_Click(object sender, RoutedEventArgs e) { this.IsEnabled = false; var t = (DateTime.Now - lastClick).TotalMillise
-
在WinForm和WPF中使用GMap.Net地图插件简单教程
如何在WinForm中使用GMap.Net 项目主页:https://greatmaps.codeplex.com/ 下载GMap.Net,我下载的版本:greatmaps_81b71bf30091,编译三个核心项目: GMap.Net.Core:核心DLL GMap.Net.WindowsForms:WinForm中使用的DLL GMap.NET.WindowsPresentation:WPF中使用的DLL 在WinForm项目中使用GMap: 1.新建一个Visual C# 的Windows
-
WPF中在摄像头视频上叠加控件的解决方案
说道WPF想必有很多朋友跟小编一样不知道wpf是什么,今天小编就给大家简单普及下基本概念. WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型.语言和框架,真正做到了分离界面设计人员与开发人员的工作:同时它提供了全新的多媒体交互用户图形界面. 一.视频呈现 前段时间,在一个wpf的项目中需要实时显示ip摄像头,对此的解决方案想必大家都应该知道很多.在win
-
在Winform和WPF中注册全局快捷键实现思路及代码
快捷键辅助类 复制代码 代码如下: class HotKey { /// <summary> /// 如果函数执行成功,返回值不为0. /// 如果函数执行失败,返回值为0.要得到扩展错误信息,调用GetLastError..NET方法:Marshal.GetLastWin32Error() /// </summary> /// <param name="hWnd">要定义热键的窗口的句柄</param> /// <param na
随机推荐
- AngularJS变量及过滤器Filter用法分析
- OGNL表达式基本语法与用法详解
- vs快捷键 用好Ctrl+Enter与Ctrl+Shift+Enter组合键让你的编辑代码速度快了很多
- Trojan.DL.VBS.Agent.cpb(k[1].js)脚本病毒的解决方法
- Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 使用Bootstrap打造特色进度条效果
- 关于UEditor编辑器远程图片上传失败的解决办法
- windows下安装pear及phpunit(注意配置好php命令行环境)
- android TextView加下划线的方法
- thinkPHP5.0框架环境变量配置方法
- c++冒泡排序示例分享
- Android实现bitmap指定区域滑动截取功能
- linux下防火墙开启某个端口号及防火墙常用命令使用(详解)
- 关于mysql查询字符集不匹配问题的解决方法
- Android实现ImageView图片双击放大及缩小
- asp实现取得数组中的最大值的代码
- 什么情况下需要创建MySQL索引?
- Bootstrap Modal遮罩弹出层代码分享
- php array_search() 函数使用
- jQuery 自动增长的文本输入框实现代码