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.pswp.cn/news/375156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375156.shtml
英文地址,請注明出處:http://en.pswp.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相關的屬…