using System; using System.Runtime.InteropServices; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Input; using Avalonia.Markup.Xaml; using ReactiveUI.Avalonia; using Microsoft.Extensions.Logging; using AuroraDesk.Presentation.ViewModels; using AuroraDesk.Presentation.Views.Dialogs; using ReactiveUI; using System.Reactive.Disposables; using System.Threading.Tasks; namespace AuroraDesk.Presentation.Views; /// /// 主窗口 /// public partial class MainWindow : ReactiveWindow, IActivatableView { private readonly ILogger? _logger; private bool _isClosingConfirmed = false; private bool _isDragging = false; private Avalonia.PixelPoint _dragStartScreenPoint; private Avalonia.PixelPoint _dragStartWindowPosition; private Avalonia.Point _lastWindowPoint; /// /// 无参构造函数,用于 XAML 设计器 /// public MainWindow() { InitializeComponent(); SetupWindowControls(); } /// /// 构造函数,接受依赖注入的 ViewModel /// /// 主窗口的 ViewModel /// 日志记录器 public MainWindow(MainWindowViewModel viewModel, ILogger? logger = null) { ArgumentNullException.ThrowIfNull(viewModel); _logger = logger; InitializeComponent(); ViewModel = viewModel; SetupWindowControls(); _logger?.LogInformation("MainWindow 已创建,ViewModel 已设置"); // 处理窗口关闭事件,显示确认框 this.Closing += OnWindowClosing; // 使用 WhenActivated 管理订阅 this.WhenActivated(disposables => { // 注册关闭确认对话框 Interaction Handler if (ViewModel != null) { disposables.Add( ViewModel.CloseConfirmInteraction .RegisterHandler(async interaction => { var dialog = new CloseConfirmDialog(interaction.Input); // 在 Linux 上,确保窗口在显示前已准备好 if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // 先准备好窗口,但不显示 dialog.ShowActivated = false; dialog.Opacity = 0; // 等待窗口初始化完成 await System.Threading.Tasks.Task.Delay(10); // 触发布局,确保内容已渲染 dialog.InvalidateMeasure(); dialog.InvalidateArrange(); // 等待布局和渲染完成 await System.Threading.Tasks.Task.Delay(50); // 设置透明度为1,准备显示 dialog.Opacity = 1; dialog.ShowActivated = true; } var result = await dialog.ShowDialog(this); interaction.SetOutput(result); })); } }); } private void InitializeComponent() { AvaloniaXamlLoader.Load(this); } /// /// 设置窗口控制按钮事件 /// private void SetupWindowControls() { // 设置左侧导航栏拖动功能 var leftNavigationBar = this.FindControl("LeftNavigationBar"); if (leftNavigationBar != null) { leftNavigationBar.PointerPressed += OnLeftNavigationBarPointerPressed; } // Linux 平台需要在窗口级别处理鼠标移动和释放事件 if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { this.PointerMoved += OnWindowPointerMoved; this.PointerReleased += OnWindowPointerReleased; } // 最小化按钮 var minimizeButton = this.FindControl