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)
{
// 注册 ReactiveUI 相关服务
services.AddSingleton<IScreen, AppViewModel>();
services.AddSingleton<AppViewModel>();
services.AddSingleton<IScreen>(provider => provider.GetRequiredService<AppViewModel>());
return services;
}
@ -51,7 +52,7 @@ public static class ServiceCollectionExtensions
public static IServiceCollection AddViewModels(this IServiceCollection services)
{
// 注册 ViewModel
services.AddTransient<MainWindowViewModel>();
services.AddSingleton<MainWindowViewModel>();
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:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@ -6,6 +6,7 @@
xmlns:converters="using:MyAvaloniaApp.Converters"
xmlns:tooltip="using:Avalonia.Controls"
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"
x:Class="MyAvaloniaApp.MainWindow"
x:DataType="vm:MainWindowViewModel"
@ -367,4 +368,4 @@
</Border>
</Grid>
</Grid>
</Window>
</reactive:ReactiveWindow>

21
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<AppViewModel>
{
private readonly ILogger<MainWindow>? _logger;
@ -26,16 +27,24 @@ public partial class MainWindow : Window
/// </summary>
/// <param name="viewModel">主窗口的 ViewModel</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;
InitializeComponent();
DataContext = viewModel;
ViewModel = appViewModel;
DataContext = appViewModel.MainWindowViewModel;
SetupWindowControls();
_logger?.LogInformation("MainWindow 已创建,ViewModel 已设置");
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
/// <summary>
/// 设置窗口控制按钮事件
/// </summary>

15
ViewModels/AppViewModel.cs

@ -1,5 +1,5 @@
using ReactiveUI;
using System;
using ReactiveUI;
namespace MyAvaloniaApp.ViewModels;
@ -8,12 +8,13 @@ namespace MyAvaloniaApp.ViewModels;
/// </summary>
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));
}
}

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年修改记录
### 整合 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
- **日期**: 2025年10月31日
- **修改内容**: 移除旧的 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.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")]

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