diff --git a/src/Avalonia.Controls/Calendar/CalendarItem.cs b/src/Avalonia.Controls/Calendar/CalendarItem.cs
index 2bfe3c9be2..3d548e15b9 100644
--- a/src/Avalonia.Controls/Calendar/CalendarItem.cs
+++ b/src/Avalonia.Controls/Calendar/CalendarItem.cs
@@ -299,6 +299,19 @@ namespace Avalonia.Controls.Primitives
}
}
+ ///
+ protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+ {
+ base.OnDetachedFromVisualTree(e);
+
+ // Reset mouse button tracking state. When the calendar popup closes
+ // (e.g. due to a programmatic window change during date selection),
+ // the PointerReleased event never fires, leaving these flags stuck.
+ // See https://github.com/AvaloniaUI/Avalonia/issues/18418
+ _isMouseLeftButtonDown = false;
+ _isMouseLeftButtonDownYearView = false;
+ }
+
private void SetDayTitles()
{
for (int childIndex = 0; childIndex < Calendar.ColumnsPerMonth; childIndex++)
diff --git a/tests/Avalonia.Controls.UnitTests/CalendarTests.cs b/tests/Avalonia.Controls.UnitTests/CalendarTests.cs
index b5395f8f6e..5e4fe3aad1 100644
--- a/tests/Avalonia.Controls.UnitTests/CalendarTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/CalendarTests.cs
@@ -1,12 +1,16 @@
using Xunit;
using System;
-using System.Collections;
using System.Collections.Generic;
using System.Linq;
+using Avalonia.Controls.Primitives;
+using Avalonia.Input;
+using Avalonia.UnitTests;
+
+#nullable enable
namespace Avalonia.Controls.UnitTests
{
- public class CalendarTests
+ public class CalendarTests : ScopedTestBase
{
private static bool CompareDates(DateTime first, DateTime second)
{
@@ -142,12 +146,12 @@ namespace Avalonia.Controls.UnitTests
///
/// The days added to the SelectedDates collection.
///
- private IList