Browse Source

add ReactiveWindow 引用

master
root 1 month ago
parent
commit
88e399d6bf
  1. 5
      Extensions/ServiceCollectionExtensions.cs
  2. 5
      MainWindow.axaml
  3. 21
      MainWindow.axaml.cs
  4. 15
      ViewModels/AppViewModel.cs
  5. BIN
      bin/Debug/net9.0/MyAvaloniaApp.dll
  6. BIN
      bin/Debug/net9.0/MyAvaloniaApp.exe
  7. BIN
      bin/Debug/net9.0/MyAvaloniaApp.pdb
  8. 16
      modify.md
  9. BIN
      obj/Debug/net9.0/Avalonia/resources
  10. 2
      obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfo.cs
  11. 2
      obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfoInputs.cache
  12. BIN
      obj/Debug/net9.0/MyAvaloniaApp.dll
  13. BIN
      obj/Debug/net9.0/MyAvaloniaApp.pdb
  14. BIN
      obj/Debug/net9.0/apphost.exe
  15. BIN
      obj/Debug/net9.0/ref/MyAvaloniaApp.dll
  16. BIN
      obj/Debug/net9.0/refint/MyAvaloniaApp.dll

5
Extensions/ServiceCollectionExtensions.cs

@ -21,7 +21,8 @@ public static class ServiceCollectionExtensions
public static IServiceCollection AddReactiveUI(this IServiceCollection services) public static IServiceCollection AddReactiveUI(this IServiceCollection services)
{ {
// 注册 ReactiveUI 相关服务 // 注册 ReactiveUI 相关服务
services.AddSingleton<IScreen, AppViewModel>(); services.AddSingleton<AppViewModel>();
services.AddSingleton<IScreen>(provider => provider.GetRequiredService<AppViewModel>());
return services; return services;
} }
@ -51,7 +52,7 @@ public static class ServiceCollectionExtensions
public static IServiceCollection AddViewModels(this IServiceCollection services) public static IServiceCollection AddViewModels(this IServiceCollection services)
{ {
// 注册 ViewModel // 注册 ViewModel
services.AddTransient<MainWindowViewModel>(); services.AddSingleton<MainWindowViewModel>();
return services; return services;
} }

5
MainWindow.axaml

@ -1,4 +1,4 @@
<Window xmlns="https://github.com/avaloniaui" <reactive:ReactiveWindow xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@ -6,6 +6,7 @@
xmlns:converters="using:MyAvaloniaApp.Converters" xmlns:converters="using:MyAvaloniaApp.Converters"
xmlns:tooltip="using:Avalonia.Controls" xmlns:tooltip="using:Avalonia.Controls"
xmlns:heroicons="clr-namespace:HeroIconsAvalonia.Controls;assembly=HeroIconsAvalonia" xmlns:heroicons="clr-namespace:HeroIconsAvalonia.Controls;assembly=HeroIconsAvalonia"
xmlns:reactive="clr-namespace:Avalonia.ReactiveUI;assembly=Avalonia.ReactiveUI"
mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="800" mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="800"
x:Class="MyAvaloniaApp.MainWindow" x:Class="MyAvaloniaApp.MainWindow"
x:DataType="vm:MainWindowViewModel" x:DataType="vm:MainWindowViewModel"
@ -367,4 +368,4 @@
</Border> </Border>
</Grid> </Grid>
</Grid> </Grid>
</Window> </reactive:ReactiveWindow>

21
MainWindow.axaml.cs

@ -1,14 +1,15 @@
using System;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Input;
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MyAvaloniaApp.ViewModels; using MyAvaloniaApp.ViewModels;
using System;
using Avalonia.Input;
namespace MyAvaloniaApp; namespace MyAvaloniaApp;
public partial class MainWindow : Window public partial class MainWindow : ReactiveWindow<AppViewModel>
{ {
private readonly ILogger<MainWindow>? _logger; private readonly ILogger<MainWindow>? _logger;
@ -26,16 +27,24 @@ public partial class MainWindow : Window
/// </summary> /// </summary>
/// <param name="viewModel">主窗口的 ViewModel</param> /// <param name="viewModel">主窗口的 ViewModel</param>
/// <param name="logger">日志记录器</param> /// <param name="logger">日志记录器</param>
public MainWindow(MainWindowViewModel viewModel, ILogger<MainWindow>? logger = null) public MainWindow(AppViewModel appViewModel, ILogger<MainWindow>? logger = null)
{ {
ArgumentNullException.ThrowIfNull(appViewModel);
_logger = logger; _logger = logger;
InitializeComponent(); InitializeComponent();
DataContext = viewModel; ViewModel = appViewModel;
DataContext = appViewModel.MainWindowViewModel;
SetupWindowControls(); SetupWindowControls();
_logger?.LogInformation("MainWindow 已创建,ViewModel 已设置"); _logger?.LogInformation("MainWindow 已创建,ViewModel 已设置");
} }
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
/// <summary> /// <summary>
/// 设置窗口控制按钮事件 /// 设置窗口控制按钮事件
/// </summary> /// </summary>

15
ViewModels/AppViewModel.cs

@ -1,5 +1,5 @@
using ReactiveUI;
using System; using System;
using ReactiveUI;
namespace MyAvaloniaApp.ViewModels; namespace MyAvaloniaApp.ViewModels;
@ -8,12 +8,13 @@ namespace MyAvaloniaApp.ViewModels;
/// </summary> /// </summary>
public class AppViewModel : ReactiveObject, IScreen public class AppViewModel : ReactiveObject, IScreen
{ {
public RoutingState Router { get; } = new RoutingState(); public RoutingState Router { get; }
public AppViewModel() public MainWindowViewModel MainWindowViewModel { get; }
public AppViewModel(MainWindowViewModel mainWindowViewModel)
{ {
// 配置路由 - 默认导航到主窗口 Router = new RoutingState();
// 注意:这里应该通过依赖注入获取 MainWindowViewModel MainWindowViewModel = mainWindowViewModel ?? throw new ArgumentNullException(nameof(mainWindowViewModel));
// Router.Navigate.Execute(new MainWindowViewModel());
} }
} }

BIN
bin/Debug/net9.0/MyAvaloniaApp.dll

Binary file not shown.

BIN
bin/Debug/net9.0/MyAvaloniaApp.exe

Binary file not shown.

BIN
bin/Debug/net9.0/MyAvaloniaApp.pdb

Binary file not shown.

16
modify.md

@ -2,6 +2,22 @@
## 2025年修改记录 ## 2025年修改记录
### 整合 AppViewModel 并完善 ReactiveWindow 架构
- **日期**: 2025年10月31日
- **修改内容**: 主窗口改用 ReactiveWindow,并通过 AppViewModel 提供主视图模型,完善依赖注入配置以符合 Avalonia.ReactiveUI 模式
- **修改文件**:
- MainWindow.axaml
- MainWindow.axaml.cs
- ViewModels/AppViewModel.cs
- Extensions/ServiceCollectionExtensions.cs
- **解决方案**:
- MainWindow 继承 ReactiveWindow<AppViewModel>,并将 DataContext 绑定到 AppViewModel.MainWindowViewModel,保留原有绑定结构
- 在 AppViewModel 中注入 MainWindowViewModel,集中管理路由状态和根视图模型
- 调整服务注册方式,确保 AppViewModel 与 MainWindowViewModel 以单例形式出现在 DI 容器中,并通过 IScreen 对外暴露
- 手动实现 InitializeComponent 以兼容 ReactiveWindow 的初始化流程
- **测试结果**:
- `dotnet build`(2025-10-31)通过
### 重构 EditorPageView 以直接使用 AvaloniaEdit.TextMate ### 重构 EditorPageView 以直接使用 AvaloniaEdit.TextMate
- **日期**: 2025年10月31日 - **日期**: 2025年10月31日
- **修改内容**: 移除旧的 BindableTextEditor,自定义附加属性实现 MVVM 绑定,并通过 TextMateHelper 统一语法高亮逻辑 - **修改内容**: 移除旧的 BindableTextEditor,自定义附加属性实现 MVVM 绑定,并通过 TextMateHelper 统一语法高亮逻辑

BIN
obj/Debug/net9.0/Avalonia/resources

Binary file not shown.

2
obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfo.cs

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("MyAvaloniaApp")] [assembly: System.Reflection.AssemblyCompanyAttribute("MyAvaloniaApp")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [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.AssemblyProductAttribute("MyAvaloniaApp")]
[assembly: System.Reflection.AssemblyTitleAttribute("MyAvaloniaApp")] [assembly: System.Reflection.AssemblyTitleAttribute("MyAvaloniaApp")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

2
obj/Debug/net9.0/MyAvaloniaApp.AssemblyInfoInputs.cache

@ -1 +1 @@
766f73ce23faadf06c3dea8c85c8321692de9c1311687760c1eb88fe735925f7 780e815b0a468a77106c5922cb2d70ec804cf2152690e28909659c98fe2b047c

BIN
obj/Debug/net9.0/MyAvaloniaApp.dll

Binary file not shown.

BIN
obj/Debug/net9.0/MyAvaloniaApp.pdb

Binary file not shown.

BIN
obj/Debug/net9.0/apphost.exe

Binary file not shown.

BIN
obj/Debug/net9.0/ref/MyAvaloniaApp.dll

Binary file not shown.

BIN
obj/Debug/net9.0/refint/MyAvaloniaApp.dll

Binary file not shown.
Loading…
Cancel
Save