106 lines
3.6 KiB
C#
106 lines
3.6 KiB
C#
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;
|
||
using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services;
|
||
using Serilog;
|
||
using System;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance
|
||
{
|
||
public partial class App : Application
|
||
{
|
||
private static bool exceptionHandlersRegistered;
|
||
private readonly MachineLicenseService licenseService = new();
|
||
|
||
public override void Initialize()
|
||
{
|
||
AvaloniaXamlLoader.Load(this);
|
||
}
|
||
|
||
public override void OnFrameworkInitializationCompleted()
|
||
{
|
||
RegisterExceptionHandlers();
|
||
|
||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||
{
|
||
var check = licenseService.Check(updateHeartbeat: true);
|
||
if (check.CanUseSoftware)
|
||
{
|
||
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();
|
||
}
|
||
};
|
||
}
|
||
}
|
||
|
||
base.OnFrameworkInitializationCompleted();
|
||
}
|
||
|
||
private void ShowMainWindow(IClassicDesktopStyleApplicationLifetime desktop, bool showImmediately)
|
||
{
|
||
var viewModel = new MainWindowViewModel(licenseService);
|
||
desktop.MainWindow = new MainWindow(licenseService)
|
||
{
|
||
DataContext = viewModel,
|
||
};
|
||
if (showImmediately)
|
||
{
|
||
desktop.MainWindow.Show();
|
||
}
|
||
}
|
||
|
||
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;
|
||
}
|
||
}
|
||
}
|