diff --git a/demo/Ursa.Demo/Views/MainWindow.axaml.cs b/demo/Ursa.Demo/Views/MainWindow.axaml.cs index f5b4304..3edd6fe 100644 --- a/demo/Ursa.Demo/Views/MainWindow.axaml.cs +++ b/demo/Ursa.Demo/Views/MainWindow.axaml.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Ursa.Controls; namespace Ursa.Demo.Views; @@ -8,4 +9,10 @@ public partial class MainWindow : UrsaWindow { InitializeComponent(); } + + protected override async Task CanClose() + { + var result = await MessageBox.ShowOverlayAsync("Are you sure you want to exit?\n您确定要退出吗?", "Exit", button: MessageBoxButton.YesNo); + return result == MessageBoxResult.Yes; + } } \ No newline at end of file diff --git a/src/Ursa/Windows/UrsaWindow.cs b/src/Ursa/Windows/UrsaWindow.cs index a6be365..1719493 100644 --- a/src/Ursa/Windows/UrsaWindow.cs +++ b/src/Ursa/Windows/UrsaWindow.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; using Avalonia; using Avalonia.Controls; @@ -100,5 +101,24 @@ public class UrsaWindow: Window set => SetValue(TitleBarMarginProperty, value); } + protected virtual async Task CanClose() + { + return await Task.FromResult(true); + } + private bool _canClose = false; + protected override async void OnClosing(WindowClosingEventArgs e) + { + VerifyAccess(); + if (!_canClose) + { + e.Cancel = true; + _canClose = await CanClose(); + if (_canClose) + { + Close(); + } + } + base.OnClosing(e); + } } \ No newline at end of file