2026-06-02 17:41:53 +08:00
|
|
|
|
using Avalonia;
|
|
|
|
|
|
using Avalonia.Controls.ApplicationLifetimes;
|
|
|
|
|
|
using Avalonia.Data.Core;
|
|
|
|
|
|
using Avalonia.Data.Core.Plugins;
|
|
|
|
|
|
using Avalonia.Markup.Xaml;
|
|
|
|
|
|
using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.ViewModels;
|
|
|
|
|
|
using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Views;
|
2026-06-15 10:28:16 +08:00
|
|
|
|
using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services;
|
2026-06-02 18:45:14 +08:00
|
|
|
|
using Serilog;
|
|
|
|
|
|
using System;
|
2026-06-02 17:41:53 +08:00
|
|
|
|
using System.Linq;
|
2026-06-02 18:45:14 +08:00
|
|
|
|
using System.Threading.Tasks;
|
2026-06-02 17:41:53 +08:00
|
|
|
|
|
|
|
|
|
|
namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance
|
|
|
|
|
|
{
|
|
|
|
|
|
public partial class App : Application
|
|
|
|
|
|
{
|
2026-06-02 18:45:14 +08:00
|
|
|
|
private static bool exceptionHandlersRegistered;
|
2026-06-15 10:28:16 +08:00
|
|
|
|
private readonly MachineLicenseService licenseService = new();
|
2026-06-02 18:45:14 +08:00
|
|
|
|
|
2026-06-02 17:41:53 +08:00
|
|
|
|
public override void Initialize()
|
|
|
|
|
|
{
|
|
|
|
|
|
AvaloniaXamlLoader.Load(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void OnFrameworkInitializationCompleted()
|
|
|
|
|
|
{
|
2026-06-02 18:45:14 +08:00
|
|
|
|
RegisterExceptionHandlers();
|
|
|
|
|
|
|
2026-06-02 17:41:53 +08:00
|
|
|
|
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
|
|
|
|
|
{
|
2026-06-15 10:28:16 +08:00
|
|
|
|
var check = licenseService.Check(updateHeartbeat: true);
|
|
|
|
|
|
if (check.CanUseSoftware)
|
2026-06-02 17:41:53 +08:00
|
|
|
|
{
|
2026-06-15 10:28:16 +08:00
|
|
|
|
ShowMainWindow(desktop, showImmediately: false);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
var mode = check.State switch
|
|
|
|
|
|
{
|
|
|
|
|
|
Models.LicenseCheckState.NotInitialized => LicenseWindowMode.Initialization,
|
|
|
|
|
|
Models.LicenseCheckState.Expired => LicenseWindowMode.Unlock,
|
|
|
|
|
|
_ => LicenseWindowMode.Blocked
|
|
|
|
|
|
};
|
|
|
|
|
|
var licenseWindow = new LicenseWindow(licenseService, mode, check.Message);
|
|
|
|
|
|
desktop.MainWindow = licenseWindow;
|
|
|
|
|
|
licenseWindow.Closed += (_, _) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (licenseWindow.Succeeded)
|
|
|
|
|
|
{
|
|
|
|
|
|
ShowMainWindow(desktop, showImmediately: true);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
desktop.Shutdown();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
2026-06-02 17:41:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
base.OnFrameworkInitializationCompleted();
|
|
|
|
|
|
}
|
2026-06-02 18:45:14 +08:00
|
|
|
|
|
2026-06-15 10:28:16 +08:00
|
|
|
|
private void ShowMainWindow(IClassicDesktopStyleApplicationLifetime desktop, bool showImmediately)
|
|
|
|
|
|
{
|
|
|
|
|
|
var viewModel = new MainWindowViewModel(licenseService);
|
|
|
|
|
|
desktop.MainWindow = new MainWindow(licenseService)
|
|
|
|
|
|
{
|
|
|
|
|
|
DataContext = viewModel,
|
|
|
|
|
|
};
|
|
|
|
|
|
if (showImmediately)
|
|
|
|
|
|
{
|
|
|
|
|
|
desktop.MainWindow.Show();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-02 18:45:14 +08:00
|
|
|
|
private static void RegisterExceptionHandlers()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (exceptionHandlersRegistered)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AppDomain.CurrentDomain.UnhandledException += (_, args) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (args.ExceptionObject is Exception exception)
|
|
|
|
|
|
{
|
|
|
|
|
|
Log.Fatal(exception, "捕获到 AppDomain 未处理异常,IsTerminating={IsTerminating}", args.IsTerminating);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Log.Fatal("捕获到 AppDomain 未处理异常:{ExceptionObject}", args.ExceptionObject);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
TaskScheduler.UnobservedTaskException += (_, args) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
Log.Error(args.Exception, "捕获到未观察的后台任务异常");
|
|
|
|
|
|
args.SetObserved();
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
exceptionHandlersRegistered = true;
|
|
|
|
|
|
}
|
2026-06-02 17:41:53 +08:00
|
|
|
|
}
|
2026-06-02 18:45:14 +08:00
|
|
|
|
}
|