diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index e0fefef0b7..bfb9973ee6 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -302,18 +302,17 @@ namespace Avalonia.Controls internal void Close(bool ignoreCancel) { - var cancelClosing = false; try { - cancelClosing = HandleClosing(); + if (!ignoreCancel && HandleClosing()) + { + return; + } } finally { - if (ignoreCancel || !cancelClosing) - { - PlatformImpl?.Dispose(); - HandleClosed(); - } + PlatformImpl?.Dispose(); + HandleClosed(); } } @@ -324,6 +323,7 @@ namespace Avalonia.Controls { var args = new CancelEventArgs(); Closing?.Invoke(this, args); + return args.Cancel; } diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index e80ffd97cd..570cebe0e5 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -188,6 +188,27 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void Closing_Should_Only_Be_Invoked_Once() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var window = new Window(); + var count = 0; + + window.Closing += + (sender, e) => + { + count++; + }; + + window.Show(); + window.Close(); + + Assert.Equal(1, count); + } + } + [Fact] public void Showing_Should_Start_Renderer() {