From 8ee920bde479cf280b4c549fc79a7c0bbf36efd6 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Mon, 7 Oct 2024 17:53:41 +0800 Subject: [PATCH] feat: add CanClose hook to easily block window closing. --- demo/Ursa.Demo/Views/MainWindow.axaml.cs | 7 +++++++ src/Ursa/Windows/UrsaWindow.cs | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/demo/Ursa.Demo/Views/MainWindow.axaml.cs b/demo/Ursa.Demo/Views/MainWindow.axaml.cs index f5b4304..4ed6d7c 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?", "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