重构 EditorTreeView 以使用 Microsoft.UI.Xaml.Controls

在 `EditorTreeView.cs` 中:
- 添加了 `Microsoft.UI.Xaml.Controls`、`RustTools.muqing` 和 `WinUIEditor` 的引用。
- 将 `EditorTreeView` 类从继承 `TreeView` 改为继承 `Microsoft.UI.Xaml.Controls.TreeView`。
- 修改了事件处理程序的绑定方式,去掉了 `this` 关键字。
- 修改了 `TreeView_ItemInvoked`、`TreeView_Expanding` 和 `TreeView_Collapsed` 方法的参数类型,使用了 `Microsoft.UI.Xaml.Controls.TreeView`。
- 在 `TreeView_ItemInvoked` 方法中,添加了处理文件点击事件的逻辑,包括创建 `CodeEditorControl` 实例并将其添加到 `TabViewItem` 中。
- 添加了 `AddTabItem` 事件。

在 `EditorWin.xaml` 中:
- 添加了 `WinUIEditor` 的命名空间引用。
- 在 `Grid` 中添加了 `RowDefinition`,用于定义 `TabView` 的头部和内容区域的高度。
- 注释掉了 `CodeEditorControl` 的 XAML 定义。

在 `EditorWin.xaml.cs` 中:
- 添加了 `Microsoft.UI.Xaml.Media` 和 `WinUIEditor` 的引用。
- 在 `EditorWin` 构造函数中,添加了 `gridedit.SizeChanged` 事件处理程序,用于调整 `TabView` 的高度。
- 添加了 `TreeView_AddTabItem` 方法,用于处理 `AddTabItem` 事件。
- 删除了 `MyTabView_AddTabButtonClick` 方法。

在 `RustTools.csproj` 中:
- 添加了 `WinUIEdit` 包的引用。

重构 EditorTreeView 并添加 WinUI 支持

将 EditorTreeView 类更改为 Microsoft.UI.Xaml.Controls.TreeView,添加相关命名空间引用。更新方法参数类型并处理文件点击事件。调整 EditorWin.xaml 和 EditorWin.xaml.cs 文件,添加事件处理逻辑。移除 MyTabView_AddTabButtonClick 方法,并在 RustTools.csproj 中添加 WinUIEdit 包引用。
This commit is contained in:
muqing 2025-01-21 19:26:04 +08:00
parent 7735738c3d
commit e88ec9db04
4 changed files with 67 additions and 45 deletions

View File

@ -1,63 +1,67 @@
 using System.Diagnostics;
using System.Diagnostics;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using RustTools.muqing;
using WinUIEditor;
namespace RustTools.Editor; namespace RustTools.Editor;
public class EditorTreeView : TreeView public class EditorTreeView : Microsoft.UI.Xaml.Controls.TreeView
{ {
public EditorTreeView() public EditorTreeView()
{ {
//点击事件 //点击事件
this.ItemInvoked += TreeView_ItemInvoked; ItemInvoked += TreeView_ItemInvoked;
// TreeView.Expanding // TreeView.Expanding
//当用户点击小箭头展开节点时触发。 //当用户点击小箭头展开节点时触发。
//TreeView.Collapsed //TreeView.Collapsed
//当用户点击小箭头折叠节点时触发。 //当用户点击小箭头折叠节点时触发。
this.Expanding += TreeView_Expanding; Expanding += TreeView_Expanding;
this.Collapsed += TreeView_Collapsed; Collapsed += TreeView_Collapsed;
} }
private async void TreeView_ItemInvoked(TreeView sender, TreeViewItemInvokedEventArgs args) private void TreeView_ItemInvoked(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewItemInvokedEventArgs args)
{ {
// 获取触发点击的 TreeViewItem // 获取触发点击的 TreeViewItem
var treeViewItem = sender.ContainerFromItem(args.InvokedItem) as TreeViewItem; //var treeViewItem = sender.ContainerFromItem(args.InvokedItem) as TreeViewItem;
if (args.InvokedItem is FileItem invokedItem) if (args.InvokedItem is FileItem invokedItem)
{ {
if (invokedItem.IsFolder) if (invokedItem.IsFolder)
{ {
//invokedItem.Children.Clear();
//Debug.WriteLine($"Folder clicked: {invokedItem.Name}");
//// 异步加载子项数据
//var newChildren = await Task.Run(() => EditorLoad.GetData(invokedItem.Dir));
//// 更新 Children 集合
//foreach (var child in newChildren)
//{
// invokedItem.Children.Add(child);
//}
//// 展开 TreeViewItem
//if (treeViewItem != null&&treeViewItem.IsExpanded==false)
//{
// treeViewItem.IsExpanded = true;
//}
} }
else else
{ {
Debug.WriteLine($"File clicked: {invokedItem.Name}"); 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() EditorWin.TabViewList.Add(new TabViewItem()
{ {
Header = invokedItem.Name, Header = invokedItem.Name,
IconSource = new SymbolIconSource() { Symbol = Symbol.Document },
Content = codeEditorControl
}); });
//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<TabViewItem,CodeEditorControl> AddTabItem;
// TreeView.Expanding 事件 // TreeView.Expanding 事件
private async void TreeView_Expanding(TreeView sender, TreeViewExpandingEventArgs args) private async void TreeView_Expanding(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewExpandingEventArgs args)
{ {
if (args.Item is FileItem expandingItem) if (args.Item is FileItem expandingItem)
{ {
@ -79,7 +83,7 @@ public class EditorTreeView : TreeView
} }
// TreeView.Collapsed 事件 // TreeView.Collapsed 事件
private void TreeView_Collapsed(TreeView sender, TreeViewCollapsedEventArgs args) private void TreeView_Collapsed(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewCollapsedEventArgs args)
{ {
if (args.Item is FileItem collapsedItem) if (args.Item is FileItem collapsedItem)
{ {

View File

@ -3,11 +3,11 @@
x:Class="RustTools.Editor.EditorWin" x:Class="RustTools.Editor.EditorWin"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WinUIEditor="using:WinUIEditor"
xmlns:controlpages="using:RustTools.Editor" xmlns:controlpages="using:RustTools.Editor"
xmlns:controls="using:CommunityToolkit.WinUI.Controls" xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:editor="using:RustTools.Editor" xmlns:editor="using:RustTools.Editor"
xmlns:local="using:RustTools"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:windowex="using:WinUIEx" xmlns:windowex="using:WinUIEx"
MinWidth="500" MinWidth="500"
@ -103,16 +103,20 @@
Grid.Row="1" Grid.Row="1"
Grid.Column="2"> Grid.Column="2">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<!-- TabView header height -->
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<!-- TabView content area height -->
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TabView <TabView
x:Name="tabview" x:Name="tabview"
Grid.Row="0"
Height="auto"
AddTabButtonClick="MyTabView_AddTabButtonClick"
IsAddTabButtonVisible="False" IsAddTabButtonVisible="False"
TabCloseRequested="MyTabView_TabCloseRequested" /> TabCloseRequested="MyTabView_TabCloseRequested" />
<!--<WinUIEditor:CodeEditorControl
x:Name="MyEditor"
HighlightingLanguage="csharp"
DataContextChanged="OnCodeTextChanged" />-->
</Grid> </Grid>
</Grid> </Grid>
</Page> </Page>

View File

@ -4,8 +4,10 @@ using Microsoft.UI;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using RustTools.muqing; using RustTools.muqing;
using WinRT.Interop; using WinRT.Interop;
using WinUIEditor;
namespace RustTools.Editor; namespace RustTools.Editor;
/// <summary> /// <summary>
/// 编辑器主窗口 /// 编辑器主窗口
@ -39,10 +41,35 @@ public sealed partial class EditorWin : WindowEx
DataSource = EditorLoad.GetData(directoryInfo.FullName); DataSource = EditorLoad.GetData(directoryInfo.FullName);
treeView.ItemsSource = DataSource; treeView.ItemsSource = DataSource;
Closed += EditorWin_Closed; Closed += EditorWin_Closed;
tabview.TabItemsSource = TabViewList; //设置TabView的高度
gridedit.SizeChanged += (sender, args) =>
{
tabview.Height = gridedit.ActualHeight - 10;
};
tabview.TabItemsSource = TabViewList;
treeView.AddTabItem += TreeView_AddTabItem;
} }
private void TreeView_AddTabItem(TabViewItem obj,CodeEditorControl codeEditorControl){
tabview.SelectedItem = obj;
var title = obj.Header.ToString();
codeEditorControl.Editor.UpdateUI += (sender, args) =>
{
//是否有可以撤销的历史记录
var a = codeEditorControl.Editor.CanUndo();
if (a)
{
obj.Header = $"{title} *";
}
else
{
obj.Header = title;
}
Debug.WriteLine($"UpdateUI :" + a);
};
}
//用户有没有保存 //用户有没有保存
@ -86,18 +113,6 @@ public sealed partial class EditorWin : WindowEx
} }
ClosedDialog = null; ClosedDialog = null;
} }
// 添加新选项卡
private void MyTabView_AddTabButtonClick(TabView sender, object args)
{
var newTab = new TabViewItem
{
Header = $"New Tab {TabViewList.Count + 1}",
Content = new TextBlock { Text = "This is a new tab." }
};
TabViewList.Add(newTab);
}
// 关闭选项卡 // 关闭选项卡
private void MyTabView_TabCloseRequested(TabView sender, TabViewTabCloseRequestedEventArgs args) private void MyTabView_TabCloseRequested(TabView sender, TabViewTabCloseRequestedEventArgs args)
{ {
@ -106,5 +121,4 @@ public sealed partial class EditorWin : WindowEx
TabViewList.Remove(tab); TabViewList.Remove(tab);
} }
} }
} }

View File

@ -35,7 +35,7 @@
<PackageReference Include="Microsoft.Windows.CsWinRT" Version="2.0.7" /> <PackageReference Include="Microsoft.Windows.CsWinRT" Version="2.0.7" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" /> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" />
<PackageReference Include="WinUIEdit" Version="0.0.3-prerelease" />
<Manifest Include="$(ApplicationManifest)" /> <Manifest Include="$(ApplicationManifest)" />
</ItemGroup> </ItemGroup>