From d358c31a7d18f40cbbb514064d7724b5f2b1aee0 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sun, 31 May 2026 15:52:03 +0800 Subject: [PATCH] feat: inline editing with click-to-edit, TextBox overlay, Focus+SelectAll - Grid overlay: TextBox covers TextBlock when editing (no more dual display) - EditValue property: auto-initialized to DisplayName on edit start - Click on already-selected node enters inline edit (PreviewMouseLeftButtonDown) - Right-click auto-selects node before context menu - TextBox IsVisibleChanged: Focus + SelectAll on Loaded priority - XAML Visibility moved to Style setter (fix DataTrigger precedence) - Light yellow background (#FFFFFDE6) --- src/UI/WPF/ViewModels/AliasNodeViewModel.cs | 23 ++- src/UI/WPF/Views/AliasTreeControl.xaml | 51 +++--- src/UI/WPF/Views/AliasTreeControl.xaml.cs | 176 +++++++++++++++++--- 3 files changed, 191 insertions(+), 59 deletions(-) diff --git a/src/UI/WPF/ViewModels/AliasNodeViewModel.cs b/src/UI/WPF/ViewModels/AliasNodeViewModel.cs index e4d5a48..8321c58 100644 --- a/src/UI/WPF/ViewModels/AliasNodeViewModel.cs +++ b/src/UI/WPF/ViewModels/AliasNodeViewModel.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.Windows.Input; using Autodesk.Navisworks.Api; namespace NavisworksTransport.UI.WPF.ViewModels @@ -56,9 +57,25 @@ namespace NavisworksTransport.UI.WPF.ViewModels public bool IsEditing { get => _isEditing; - set { _isEditing = value; OnPropertyChanged(nameof(IsEditing)); } + set + { + if (_isEditing == value) return; + _isEditing = value; + OnPropertyChanged(nameof(IsEditing)); + // 进入编辑时初始化 EditValue 为当前显示名 + if (value) + EditValue = DisplayName; + } } + /// 编辑框的临时文本(进入编辑时初始化为 DisplayName) + public string EditValue + { + get => _editValue; + set { _editValue = value; OnPropertyChanged(nameof(EditValue)); } + } + private string _editValue; + /// 是否孤儿节点(模型结构变化后无法定位) public bool IsOrphan { @@ -92,8 +109,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels public AliasNodeViewModel() { + StartEditCommand = new RelayCommand(() => IsEditing = true); } + /// 启动内联编辑的命令 + public ICommand StartEditCommand { get; } + /// /// 刷新显示文本(别名变更新调用) /// diff --git a/src/UI/WPF/Views/AliasTreeControl.xaml b/src/UI/WPF/Views/AliasTreeControl.xaml index 58f8ede..fd05572 100644 --- a/src/UI/WPF/Views/AliasTreeControl.xaml +++ b/src/UI/WPF/Views/AliasTreeControl.xaml @@ -2,7 +2,8 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:NavisworksTransport.UI.WPF.ViewModels" - xmlns:converters="clr-namespace:NavisworksTransport.UI.WPF.Converters"> + xmlns:converters="clr-namespace:NavisworksTransport.UI.WPF.Converters" + PreviewKeyDown="UserControl_PreviewKeyDown"> @@ -16,16 +17,16 @@ - - - + + - - + - - - - + @@ -98,14 +91,6 @@ -