using System.Diagnostics; using Microsoft.UI.Xaml.Controls; using RustTools.muqing; using WinUIEditor; namespace RustTools.Editor; public class EditorTreeView : Microsoft.UI.Xaml.Controls.TreeView { public EditorTreeView() { //点击事件 ItemInvoked += TreeView_ItemInvoked; // TreeView.Expanding //当用户点击小箭头展开节点时触发。 //TreeView.Collapsed //当用户点击小箭头折叠节点时触发。 Expanding += TreeView_Expanding; Collapsed += TreeView_Collapsed; } private void TreeView_ItemInvoked(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewItemInvokedEventArgs args) { // 获取触发点击的 TreeViewItem //var treeViewItem = sender.ContainerFromItem(args.InvokedItem) as TreeViewItem; if (args.InvokedItem is FileItem invokedItem) { if (invokedItem.IsFolder) { } else { //检查是否存在此标签了 var a = EditorWin.TabViewList.FirstOrDefault(tabItem => tabItem.Tag != null && tabItem.Tag.ToString().Equals(invokedItem.Dir)); if (a!=null) { SelectedItem?.Invoke(a); return; } Debug.WriteLine($"File clicked: {invokedItem.Name}"); var wb = wj.dqwb(invokedItem.Dir); var codeEditorControl = new CodeEditorControl(); codeEditorControl.Editor.SetText(wb); //codeEditorControl.Editor.SyntaxHighlighting = fileName.EndsWith(".json") ? "Json" : "CSharp"; EditorWin.TabViewList.Add(new TabViewItem() { Header = invokedItem.Name, IconSource = new SymbolIconSource() { Symbol = Symbol.Document }, Content = codeEditorControl,Tag=invokedItem.Dir }); //codeEditorControl.Editor.CanUndo codeEditorControl.Editor.EmptyUndoBuffer(); codeEditorControl.Editor.AutoCCancelled += (sender, args) => { Debug.WriteLine("AutoCCancelled"); }; // DefaultColorsChanged 监听的是颜色设置的变化(如主题的变化)。 //SyntaxHighlightingApplied 监听的是语法高亮的应用,通常在文本解析后触发。 AddTabItem?.Invoke(EditorWin.TabViewList[^1],codeEditorControl); } } } public event Action AddTabItem; public event Action SelectedItem; // TreeView.Expanding 事件 private async void TreeView_Expanding(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewExpandingEventArgs args) { if (args.Item is FileItem expandingItem) { Debug.WriteLine($"Expanding: {expandingItem.Name}"); // 如果需要动态加载子项(仅当没有加载过子项时) if (expandingItem.IsFolder) { expandingItem.Children.Clear(); var newChildren = await Task.Run(() => EditorLoad.GetData(expandingItem.Dir)); // 更新 Children 集合 foreach (var child in newChildren) { expandingItem.Children.Add(child); } Debug.WriteLine($"Loaded children for: {expandingItem.Name}"); } } } // TreeView.Collapsed 事件 private void TreeView_Collapsed(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewCollapsedEventArgs args) { if (args.Item is FileItem collapsedItem) { // 清空子节点集合 if (collapsedItem.IsFolder && collapsedItem.Children != null) { // 设置当前项的所有子节点的 IsExpanded 为 false //SetIsExpandedForChildren(collapsedItem, false); Debug.WriteLine($"Children cleared for: {collapsedItem.Name}"); } // 处理折叠事件(例如,清理子项、节省资源等) } } // 递归设置子节点的 IsExpanded 为 false private void SetIsExpandedForChildren(FileItem item, bool isExpanded) { foreach (var child in item.Children) { // 设置每个子项的 IsExpanded 状态 child.IsExpanded = isExpanded; // 如果子项有子节点,递归处理 if (child.IsFolder && child.Children.Count > 0) { SetIsExpandedForChildren(child, isExpanded); } } } }