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