diff --git a/Extensions/ServiceCollectionExtensions.cs b/Extensions/ServiceCollectionExtensions.cs index 6075e64..f54f014 100644 --- a/Extensions/ServiceCollectionExtensions.cs +++ b/Extensions/ServiceCollectionExtensions.cs @@ -21,7 +21,8 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddReactiveUI(this IServiceCollection services) { // 注册 ReactiveUI 相关服务 - services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(provider => provider.GetRequiredService()); return services; } @@ -51,7 +52,7 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddViewModels(this IServiceCollection services) { // 注册 ViewModel - services.AddTransient(); + services.AddSingleton(); return services; } diff --git a/MainWindow.axaml b/MainWindow.axaml index 32b84b2..7c047ab 100644 --- a/MainWindow.axaml +++ b/MainWindow.axaml @@ -1,4 +1,4 @@ - - + diff --git a/MainWindow.axaml.cs b/MainWindow.axaml.cs index a05bd73..ce13eb5 100644 --- a/MainWindow.axaml.cs +++ b/MainWindow.axaml.cs @@ -1,14 +1,15 @@ +using System; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Avalonia.Controls.Primitives; +using Avalonia.Input; +using Avalonia.Markup.Xaml; +using Avalonia.ReactiveUI; using Microsoft.Extensions.Logging; using MyAvaloniaApp.ViewModels; -using System; -using Avalonia.Input; namespace MyAvaloniaApp; -public partial class MainWindow : Window +public partial class MainWindow : ReactiveWindow { private readonly ILogger? _logger; @@ -26,16 +27,24 @@ public partial class MainWindow : Window /// /// 主窗口的 ViewModel /// 日志记录器 - public MainWindow(MainWindowViewModel viewModel, ILogger? logger = null) + public MainWindow(AppViewModel appViewModel, ILogger? logger = null) { + ArgumentNullException.ThrowIfNull(appViewModel); + _logger = logger; InitializeComponent(); - DataContext = viewModel; + ViewModel = appViewModel; + DataContext = appViewModel.MainWindowViewModel; SetupWindowControls(); _logger?.LogInformation("MainWindow 已创建,ViewModel 已设置"); } + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + /// /// 设置窗口控制按钮事件 /// diff --git a/ViewModels/AppViewModel.cs b/ViewModels/AppViewModel.cs index 13711d2..10f7c03 100644 --- a/ViewModels/AppViewModel.cs +++ b/ViewModels/AppViewModel.cs @@ -1,5 +1,5 @@ -using ReactiveUI; using System; +using ReactiveUI; namespace MyAvaloniaApp.ViewModels; @@ -8,12 +8,13 @@ namespace MyAvaloniaApp.ViewModels; /// public class AppViewModel : ReactiveObject, IScreen { - public RoutingState Router { get; } = new RoutingState(); - - public AppViewModel() + public RoutingState Router { get; } + + public MainWindowViewModel MainWindowViewModel { get; } + + public AppViewModel(MainWindowViewModel mainWindowViewModel) { - // 配置路由 - 默认导航到主窗口 - // 注意:这里应该通过依赖注入获取 MainWindowViewModel - // Router.Navigate.Execute(new MainWindowViewModel()); + Router = new RoutingState(); + MainWindowViewModel = mainWindowViewModel ?? throw new ArgumentNullException(nameof(mainWindowViewModel)); } } diff --git a/bin/Debug/net9.0/MyAvaloniaApp.dll b/bin/Debug/net9.0/MyAvaloniaApp.dll index f8f9ec4..53ab786 100644 Binary files a/bin/Debug/net9.0/MyAvaloniaApp.dll and b/bin/Debug/net9.0/MyAvaloniaApp.dll differ diff --git a/bin/Debug/net9.0/MyAvaloniaApp.exe b/bin/Debug/net9.0/MyAvaloniaApp.exe index 72bc458..04b51f3 100644 Binary files a/bin/Debug/net9.0/MyAvaloniaApp.exe and b/bin/Debug/net9.0/MyAvaloniaApp.exe differ diff --git a/bin/Debug/net9.0/MyAvaloniaApp.pdb b/bin/Debug/net9.0/MyAvaloniaApp.pdb index 9dd65e9..cf1694e 100644 Binary files a/bin/Debug/net9.0/MyAvaloniaApp.pdb and b/bin/Debug/net9.0/MyAvaloniaApp.pdb differ diff --git a/modify.md b/modify.md index c0ebb24..34be81b 100644 --- a/modify.md +++ b/modify.md @@ -2,6 +2,22 @@ ## 2025年修改记录 +### 整合 AppViewModel 并完善 ReactiveWindow 架构 +- **日期**: 2025年10月31日 +- **修改内容**: 主窗口改用 ReactiveWindow,并通过 AppViewModel 提供主视图模型,完善依赖注入配置以符合 Avalonia.ReactiveUI 模式 +- **修改文件**: + - MainWindow.axaml + - MainWindow.axaml.cs + - ViewModels/AppViewModel.cs + - Extensions/ServiceCollectionExtensions.cs +- **解决方案**: + - MainWindow 继承 ReactiveWindow,并将 DataContext 绑定到 AppViewModel.MainWindowViewModel,保留原有绑定结构 + - 在 AppViewModel 中注入 MainWindowViewModel,集中管理路由状态和根视图模型 + - 调整服务注册方式,确保 AppViewModel 与 MainWindowViewModel 以单例形式出现在 DI 容器中,并通过 IScreen 对外暴露 + - 手动实现 InitializeComponent 以兼容 ReactiveWindow 的初始化流程 +- **测试结果**: + - `dotnet build`(2025-10-31)通过 + ### 重构 EditorPageView 以直接使用 AvaloniaEdit.TextMate - **日期**: 2025年10月31日 - **修改内容**: 移除旧的 BindableTextEditor,自定义附加属性实现 MVVM 绑定,并通过 TextMateHelper 统一语法高亮逻辑 diff --git a/obj/Debug/net9.0/Avalonia/resources b/obj/Debug/net9.0/Avalonia/resources index 3b86a19..82828f6 100644 Binary files a/obj/Debug/net9.0/Avalonia/resources and b/obj/Debug/net9.0/Avalonia/resources differ diff --git a/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfo.cs b/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfo.cs index c72942e..2b70ff2 100644 --- a/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfo.cs +++ b/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("MyAvaloniaApp")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a05a81acc78797ebd427e6d6aed03156b1343493")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+852bcb1ac6fa2a07734526a4221994d46897aa4b")] [assembly: System.Reflection.AssemblyProductAttribute("MyAvaloniaApp")] [assembly: System.Reflection.AssemblyTitleAttribute("MyAvaloniaApp")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfoInputs.cache b/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfoInputs.cache index 519972f..de6ac4b 100644 --- a/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfoInputs.cache +++ b/obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfoInputs.cache @@ -1 +1 @@ -766f73ce23faadf06c3dea8c85c8321692de9c1311687760c1eb88fe735925f7 +780e815b0a468a77106c5922cb2d70ec804cf2152690e28909659c98fe2b047c diff --git a/obj/Debug/net9.0/MyAvaloniaApp.dll b/obj/Debug/net9.0/MyAvaloniaApp.dll index f8f9ec4..53ab786 100644 Binary files a/obj/Debug/net9.0/MyAvaloniaApp.dll and b/obj/Debug/net9.0/MyAvaloniaApp.dll differ diff --git a/obj/Debug/net9.0/MyAvaloniaApp.pdb b/obj/Debug/net9.0/MyAvaloniaApp.pdb index 9dd65e9..cf1694e 100644 Binary files a/obj/Debug/net9.0/MyAvaloniaApp.pdb and b/obj/Debug/net9.0/MyAvaloniaApp.pdb differ diff --git a/obj/Debug/net9.0/apphost.exe b/obj/Debug/net9.0/apphost.exe index 72bc458..04b51f3 100644 Binary files a/obj/Debug/net9.0/apphost.exe and b/obj/Debug/net9.0/apphost.exe differ diff --git a/obj/Debug/net9.0/ref/MyAvaloniaApp.dll b/obj/Debug/net9.0/ref/MyAvaloniaApp.dll index 038e710..cc3fab7 100644 Binary files a/obj/Debug/net9.0/ref/MyAvaloniaApp.dll and b/obj/Debug/net9.0/ref/MyAvaloniaApp.dll differ diff --git a/obj/Debug/net9.0/refint/MyAvaloniaApp.dll b/obj/Debug/net9.0/refint/MyAvaloniaApp.dll index 038e710..cc3fab7 100644 Binary files a/obj/Debug/net9.0/refint/MyAvaloniaApp.dll and b/obj/Debug/net9.0/refint/MyAvaloniaApp.dll differ