diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs index 98ab3d69..fc4af17f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs @@ -13,6 +13,7 @@ using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Core.Setting; using Snap.Hutao.Core.Windowing.Abstraction; using Snap.Hutao.Core.Windowing.NotifyIcon; +using Snap.Hutao.Factory.ContentDialog; using Snap.Hutao.Service; using Snap.Hutao.Win32; using Snap.Hutao.Win32.Foundation; @@ -99,10 +100,13 @@ internal sealed class XamlWindowController private void OnWindowClosed(object sender, WindowEventArgs args) { + IContentDialogFactory contentDialogFactory = serviceProvider.GetRequiredService(); + contentDialogFactory.CloseCurrentDialog(); + if (XamlLifetime.ApplicationLaunchedWithNotifyIcon && !XamlLifetime.ApplicationExiting) { - args.Handled = true; - window.Hide(); + //args.Handled = true; + //window.Hide(); if (!IsNotifyIconVisible()) { diff --git a/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/ContentDialogFactory.cs b/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/ContentDialogFactory.cs index 7c06a1b7..f4326cce 100644 --- a/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/ContentDialogFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/ContentDialogFactory.cs @@ -18,6 +18,8 @@ internal sealed partial class ContentDialogFactory : IContentDialogFactory private readonly ITaskContext taskContext; private readonly AppOptions appOptions; + private Microsoft.UI.Xaml.Controls.ContentDialog? currentDialog; + /// public async ValueTask CreateForConfirmAsync(string title, string content) { @@ -32,6 +34,8 @@ internal sealed partial class ContentDialogFactory : IContentDialogFactory RequestedTheme = appOptions.ElementTheme, }; + dialog.Closed += OnContentDialogClosed; + currentDialog = dialog; return await dialog.ShowAsync(); } @@ -50,6 +54,8 @@ internal sealed partial class ContentDialogFactory : IContentDialogFactory RequestedTheme = appOptions.ElementTheme, }; + dialog.Closed += OnContentDialogClosed; + currentDialog = dialog; return await dialog.ShowAsync(); } @@ -65,6 +71,8 @@ internal sealed partial class ContentDialogFactory : IContentDialogFactory RequestedTheme = appOptions.ElementTheme, }; + dialog.Closed += OnContentDialogClosed; + currentDialog = dialog; return dialog; } @@ -75,6 +83,9 @@ internal sealed partial class ContentDialogFactory : IContentDialogFactory TContentDialog contentDialog = serviceProvider.CreateInstance(parameters); contentDialog.XamlRoot = currentWindowReference.GetXamlRoot(); contentDialog.RequestedTheme = appOptions.ElementTheme; + + contentDialog.Closed += OnContentDialogClosed; + currentDialog = contentDialog; return contentDialog; } @@ -84,6 +95,25 @@ internal sealed partial class ContentDialogFactory : IContentDialogFactory TContentDialog contentDialog = serviceProvider.CreateInstance(parameters); contentDialog.XamlRoot = currentWindowReference.GetXamlRoot(); contentDialog.RequestedTheme = appOptions.ElementTheme; + + contentDialog.Closed += OnContentDialogClosed; + currentDialog = contentDialog; return contentDialog; } + + public void CloseCurrentDialog() + { + currentDialog?.Hide(); + } + + public async ValueTask CloseCurrentDialogAsync() + { + await taskContext.SwitchToMainThreadAsync(); + currentDialog?.Hide(); + } + + private void OnContentDialogClosed(Microsoft.UI.Xaml.Controls.ContentDialog sender, ContentDialogClosedEventArgs args) + { + currentDialog = null; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/IContentDialogFactory.cs b/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/IContentDialogFactory.cs index 00c434c3..b9561aaa 100644 --- a/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/IContentDialogFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialog/IContentDialogFactory.cs @@ -40,4 +40,8 @@ internal interface IContentDialogFactory ValueTask CreateInstanceAsync(params object[] parameters) where TContentDialog : Microsoft.UI.Xaml.Controls.ContentDialog; + + void CloseCurrentDialog(); + + ValueTask CloseCurrentDialogAsync(); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs index 71f93653..02b19c8c 100644 --- a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs @@ -13,7 +13,7 @@ using Windows.Graphics; namespace Snap.Hutao; [HighQuality] -[Injection(InjectAs.Singleton)] +[Injection(InjectAs.Transient)] internal sealed partial class LaunchGameWindow : Window, IDisposable, IXamlWindowExtendContentIntoTitleBar, diff --git a/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs b/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs index 54e0e4c9..2e1a4b51 100644 --- a/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs @@ -14,7 +14,7 @@ namespace Snap.Hutao; /// 主窗体 /// [HighQuality] -[Injection(InjectAs.Singleton)] +[Injection(InjectAs.Transient)] internal sealed partial class MainWindow : Window, IXamlWindowExtendContentIntoTitleBar, IXamlWindowRectPersisted, diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml index 16227a0a..35eca560 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml @@ -129,6 +129,11 @@ Header="Rename Desktop TestFolder" IsClickEnabled="True"/> + +