金融网站建设案例,wordpress 默认主题站点,手机视频wordpress,企业年金可以取出来吗我们经常看到一些软件比如酷狗音乐#xff0c;在对列表右键进行重命名的时候#xff0c;当前列表会泛白并且进入可编辑状态#xff0c;当我们更改完成后就会并进入非编辑状态#xff0c;这些具体是怎么实现的呢#xff1f;下面的方法也许会提供一些思路#xff0c;下面的… 我们经常看到一些软件比如酷狗音乐在对列表右键进行重命名的时候当前列表会泛白并且进入可编辑状态当我们更改完成后就会并进入非编辑状态这些具体是怎么实现的呢下面的方法也许会提供一些思路下面的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的默认绑定方式ModeTwoWay。 前端XAML代码关键部分 TreeView.ItemTemplateHierarchicalDataTemplate DataType{x:Type localex:TreeMode} ItemsSource{Binding Children}CheckBox Tag{Binding Children} IsChecked{Binding IsChecked, ModeTwoWay} ToolTip{Binding ToolTip}StackPanel OrientationHorizontalImage VerticalAlignmentCenter Source{Binding Icon}/StackPanel OrientationVerticalTextBlock Text{Binding Name, ModeTwoWay} HorizontalAlignmentCenter WidthAuto/TextBox x:Namerenametextbox Text{Binding Name, ModeTwoWay} HorizontalAlignmentCenter Margin0,-20,0,0WidthAuto VisibilityCollapsed LostFocusrenametextbox_LostFous//StackPanel/StackPanelCheckBox.ContextMenuContextMenuMenuItem NamereNameItem Header重命名 ClickReNameTreeViewItem_Click /MenuItem/ContextMenu/CheckBox.ContextMenu/CheckBox /HierarchicalDataTemplate/TreeView.ItemTemplate 后端核心代码 //下面的部分是在鼠标指针位于此元素TreeViewItem上并且按下鼠标右键时发生。private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e){//此处item定义的是一个类的成员变量是一个TreeViewItem类型item GetParentObjectExTreeViewItem(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 FindVisualChildTextBox(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 GetParentObjectExTreeViewItem(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 FindVisualChildchildItem(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 FindVisualChildchildItem(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