WPF如何实现TreeView节点重命名

      我们经常看到一些软件比如酷狗音乐,在对列表右键进行重命名的时候,当前列表会泛白并且进入可编辑状态,当我们更改完成后就会并进入非编辑状态,这些具体是怎么实现的呢?下面的方法也许会提供一些思路,下面的TreeView节点是通过数据双向绑定的方式,绑定到TextBlock控件和TextBox控件的Text属性上,并且让两者绑定相同的属性,同时使TextBox控件刚好完全覆盖TextBlock控件, 由于TextBlock控件和TextBox控件的区别,TextBlock控件无法实现编辑,所以我在TextBlock控件的上面覆盖了一个TextBox控件,初始状态下我们设置TextBox的Visibility属性为Collapsed当我们点击重命名的时候,我们再设置TextBox的Visibility属性为Visible,这样我们就能够进行节点的重命名,当然当我们命名完成后(该TextBox失去焦点之后)我们再设置TextBox的Visibility属性为Collapsed,这样就完成了重命名的过程,当然我们还有很多重要的工作要做,比如如何获取HierarchicalDataTemplate中的TextBox控件这个是关键,其次TextBlock控件和TextBox控件必须同时绑定到同一属性,这样当属性值发生改变时,就能够更改TextBlock的Text属性值。注意:TextBox的默认绑定方式Mode=TwoWay。

前端XAML代码(关键部分)

<TreeView.ItemTemplate><HierarchicalDataTemplate DataType="{x:Type localex:TreeMode}" ItemsSource="{Binding Children}"><CheckBox Tag="{Binding Children}" IsChecked="{Binding IsChecked, Mode=TwoWay}" ToolTip="{Binding ToolTip}"><StackPanel Orientation="Horizontal"><Image VerticalAlignment="Center" Source="{Binding Icon}"/><StackPanel Orientation="Vertical"><TextBlock Text="{Binding Name, Mode=TwoWay}" HorizontalAlignment="Center" Width="Auto"/><TextBox x:Name="renametextbox" Text="{Binding Name, Mode=TwoWay}" HorizontalAlignment="Center" Margin="0,-20,0,0"Width="Auto"  Visibility="Collapsed"  LostFocus="renametextbox_LostFous"/></StackPanel></StackPanel><CheckBox.ContextMenu><ContextMenu><MenuItem  Name="reNameItem" Header="重命名" Click="ReNameTreeViewItem_Click">                                              </MenuItem></ContextMenu></CheckBox.ContextMenu></CheckBox>                               </HierarchicalDataTemplate></TreeView.ItemTemplate>  

后端核心代码:

        //下面的部分是在鼠标指针位于此元素(TreeViewItem)上并且按下鼠标右键时发生。private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e){//此处item定义的是一个类的成员变量,是一个TreeViewItem类型item = GetParentObjectEx<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;if (item != null){//使当前节点获得焦点item.Focus();//系统不再处理该操作e.Handled = true;}}//对当前TreeViewItem进行重命名private void ReNameTreeViewItem_Click(object sender, RoutedEventArgs e){//获取在TreeView.ItemTemplate中定义的TextBox控件tempTextBox = FindVisualChild<TextBox>(item as DependencyObject);//设置该TextBox的Visibility 属性为VisibletempTextBox.Visibility = Visibility.Visible;}  

             下面的这个函数主要是利用VisualTreeHelper.GetParent()方法获取视觉树上面的各种控件,当我们鼠标点击TreeView节点的时候,我们沿着视觉树VisualTree依次向上查找获取

        相应的控件,在本例中依次查找到的控件为:TextBlock-》StackPanel-》StackPanel-》ContentPresenter-》BulletDecorator-》CheckBox-》ContentPresenter-》Boarder-》Grid-》TreeViewItem,通过每一次的向上查找最终找到我们需要的TreeViewItem对象。

 //获取当前TreeView的TreeViewItempublic TreeViewItem GetParentObjectEx<TreeViewItem>(DependencyObject obj) where TreeViewItem : FrameworkElement{DependencyObject parent = VisualTreeHelper.GetParent(obj);while (parent != null){if (parent is TreeViewItem){return (TreeViewItem)parent;}parent = VisualTreeHelper.GetParent(parent);}return null;} 

        下面的这个函数也是非常重要的,由于我们定义的TextBox控件是在TreeView.ItemTemplate中定义的,所以无法通过this来查找当前的控件,如果无法获取当前的该控件,就无法进行下面的操作,所以这个函数也是非常重要的。和鼠标点击是沿着视觉树向上查找不同,此处我们需要沿着视觉树向下查找,直到找到我们TextBox控件为止,最终返回TextBox控件对象,这个刚好和上面的过程相反,但是这个过程也是非常重要的,具体的使用方式可以参考MSDN上面有更加具体的说明。      

  //获取ItemTemplate内部的各种控件private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject{for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++){DependencyObject child = VisualTreeHelper.GetChild(obj, i);if (child != null && child is childItem)return (childItem)child;else{childItem childOfChild = FindVisualChild<childItem>(child);if (childOfChild != null)return childOfChild;}}return null;}          //当TextBox失去焦点时发生此事件private void renametextbox_LostFous(object sender, RoutedEventArgs e){tempTextBox.Visibility = Visibility.Collapsed;}

  

 

转载于:https://www.cnblogs.com/seekdream/p/4423553.html

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

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

相关文章

8086地址传送指令LEA

LEA REG,OPRD ;操作数OPRD必须是一个存储器操作数 LEA AX,IDATA ;把IDATA的偏移地址传送到AX寄存器中DATA SEGMENTIDATA DW 1,2,3,4 DATA ENDS CODE SEGEMNT BEG:MOV AX,OFFSET IDATA ;AXIDATA的偏移地址LEA AX,IDATA ;AXIDATA的偏移地址LEA AX,DS:[IDATA] ;把ds:[IDA…

Shell --- 批量修改文件后缀脚本

for f in *.$1; dofilenamebasename $fmv $f "${filename%.*}".$2; done; Usage:&#xff1a; rename suffix rename_suffix eg: rename dat txt > ls > a.dat > rename dat txt > ls > a.txt 转载于:https://www.cnblogs.com/RookieCoder/p/5140265.…

8086标志操作指令

标号传送指令LAHF 把FLAG低八位送入AH。不影响FLAG的任何位LAHF ;把CF,PF,AF,ZF,SF送入AH的相应位即0,2,4,6,7位SAHF 把AH送入FLAG低八位。根据AH中的内容FLAG的低八位受到影响,高位不受影响MOV AH,11111111B SAHF ;(执行后CF,PF,AF,ZF,SF等于1)PUSHF 把FLAG压入栈中。不影…

最大子序列和

一、遍历所有可能情况 (1234...N)所有可能子序列如下&#xff1a; 1&#xff1b;12&#xff1b;123...... 2&#xff1b;23&#xff1b;234...... ...... N 共N趟&#xff0c;没趟可能的情况由N&#xff0c;N-1...&#xff0c;1依次递减。 时间复杂度O(N3)的算法&#xff1a; i…

!--注释--和%--注释--%有什么区别

转载&#xff1a;版权所有&#xff1a;基础软件。作者邮箱&#xff1a;s.j.l.studiohotmail.com&#xff0c;sun.j.l.studiogmail.com。本文首发于 http://www.cnblogs.com/FoundationSoft。文章转载请保持此版权信息并注明出处。 使用ASP.NET编辑页面时&#xff0c;有两种注释…

团队开发——用户需求调研报告

用户需求调研报告 项目名称&#xff1a; 躲避小球 项目编号&#xff1a;001 调研主题&#xff1a; 用户需求 访谈时间&#xff1a;2015.4.10 调研地点&#xff1a; 石家庄铁道大学图书馆 访谈部门&#xff1a; 三个人行 参与人员&#xff1a; 林彦汝 1. 访谈目的 1、让用…

8086地址传送指令LDS,LES

LDS REG,OPRE;REG是一个16位寄存器,OPRD是一个存储器操作数,为双字项,高16位送入DS,低16位送入REG LDS BX,[SI](ds:si取得存储器中32位(双字),高16位作为段值送入DS中,低十六位送入指定的BX寄存器中)data segmentidata dd 12345678H data ends code segment assume cs:code,ds:…

设计模式(十五):解释器模式

一、定义 在设定环境中&#xff0c;定义一种规则或者语法&#xff0c;通过解释器来解释规则或者语法的含义. 二、实例&#xff1a;将 二十一 —> 21 2.1 设定我们的环境 Context public class Context{public string Input { get; set; }public int Output { get; se…

8086地址传送指令LEA,LDS,LES

LEA BX,[SI] ;BX<--DS:[SI]内存单元的偏移地址,与该单元中的数据无关 LDS BX,[SI] ;BX<--DS:[si]内存单元中的数据的低16位,DS<--内存单元中数据的高16位 LES BX,[SI] ;BX<--DS:[SI] ,ES<--DS:[SI2] 显然LDS和LES的操作数是32位的(两个字 四个字节 32位) 写个…

MySQL 5.7.10 免安装配置

# 配置环境&#xff1a;windows 64bit # 安装版本&#xff1a;mysql-5.7.10-win32&#xff08;zip archive版本&#xff09; 1. ZIP Archive版是免安装的&#xff0c;只需把mysql-5.7.10-win32.zip解压到安装目录即可。 2. 在D:\Program Files\mysql-5.7.10-win32文件夹下新建配…

Cacti安装教程

CentOS 6.0架设流量监控及集中日志系统第一章、cacti的安装1、 系统的基本设置2、 设置主机名3、 [rootlocalhost ~]# vi /etc/sysconfig/network4、 [rootlocalhost ~]# exit5、 重新登陆6、 [rootGZ-Cacti ~]#7、 安装screen后台运行程序yum -y install screen8、 安装优秀的…

8086条件转移指令JE,JZ

JZ/JE 指令格式 转移条件 说明 JZ/JE 标号 ZF1 等于0或相等转移code segment assume cs:codemov ax,2mov bx,2cmp ax,bxje ok ;如果axbx 进行转移(其实是检测ZF的值进行转移操作);根据ZF1 得出axbx ,所以才有axbx 相等则转移 iout: mov ax,4c00Hint 21H ok: add a…

单片机C语言下LCD多级菜单的一种实现方法

摘要: 介绍了在C 语言环境下,在LCD 液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑、实用的程序模型。 关键词: 液晶显示屏; 多级菜单; 单片机; C 语言; LCD  中图分类号:TP311. 1    文献标识码:B 收稿日期:2005 - 11 - 210  引言 由于C 语…

fortran语法笔记

1&#xff0c;数据类型&#xff0c;fortran支持整形&#xff0c;real型&#xff0c;logical型&#xff0c;char型&#xff0c;复数型。整形分为为长整形和短整形定义长整形的方法 同时声明多个变量的话可以用逗号隔开。 加两个冒号的话可以直接在声明的时候赋值。 fortran是唯一…

8086条件转移指令JNE,JNZ

JNZ/JNE 指令格式 转移条件 说明 JNZ/JNE 标号 ZF0 不等于0或不相等转移code segment assume cs:codemov ax,5mov bx,2cmp ax,bx ;两数比较 不相等则转移 jne ok iout: mov ax,4c00Hint 21H ok: add ax,bxjmp iout code ends endAX0005 BX0002 CX0013 DX0000 SP00…

8086条件转移指令JE/JZ,JNE/JNZ

JE/JZ,JNE,JNZ检测的只是ZF的值,只要ZF满足则进行转移 JE的逻辑含义是相等则转移 但是JE进行操作的是ZF1才执行所有相等则转移是通过CMP指令来配合使用体现出的CMP AX,BX ;ax-bx 结果是否为0 {true ,ZF1} {false ,ZF0} JE OK (ZF1说明两数相等) (ZF…

git 使用手册

git 作为开源项目首选版本管理软件&#xff0c;必然其优势不容小觑&#xff0c;下面总结一下初次解除用到的一些技能 1. 基本命令介绍 git help branch 查看branch帮助文档 git branch -a 列出当前所有分支 git branch good_proj 创建分支good_proj git checkout good_p…

WZY社区

WZY社区是我自己做的一个网站&#xff0c;后面会详细更新&#xff0c;敬请关注&#xff01;转载于:https://www.cnblogs.com/jxldjsn/p/5146682.html

条件转移指令和无条件转移指令练习

无条件转移指令 JMP条件转移指令 JE JNE JB 低于转移(小于) JNB 不低于转移(大于等于) JA 高于转移(大于) JNA不高于转移(小于等于)查找出数据中0&#xff5e;9的无符号数写到itable单元中 0&#xff5e;9 大于等于0 小于等于9 用JNB和JNA最合适不过了 贴代码~assume cs:code,d…

UISearchBar控件

搜索&#xff0c;无疑可以使用UISearchBar控件&#xff01; 那就先了解一下UISearchBar控件吧&#xff01; UISearchBar控件就是要为你完成搜索功能的一个专用控件。它集成了很多你意想不到的功能和特点&#xff01; 首先&#xff0c;还是来普及一下UISearchBar控件API相关的属…