From b84c44eebd053719a05977cfc30765cd2c45a8bf Mon Sep 17 00:00:00 2001 From: Kevin Bost Date: Thu, 14 May 2026 22:40:27 -0700 Subject: [PATCH 1/2] Position date and time picker popups below fields Fixes issue #4050 by using Bottom popup placement for DatePicker and TimePicker templates, removing the unused custom popup callback helper, and adding UI tests that assert the popup opens below the text box by default. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../CustomPopupPlacementCallbackHelper.cs | 12 -------- .../MaterialDesignTheme.DatePicker.xaml | 3 +- .../MaterialDesignTheme.TimePicker.xaml | 3 +- .../WPF/DatePickers/DatePickerTests.cs | 29 +++++++++++++++++++ .../WPF/TimePickers/TimePickerTests.cs | 29 +++++++++++++++++++ 5 files changed, 60 insertions(+), 16 deletions(-) delete mode 100644 src/MaterialDesignThemes.Wpf/CustomPopupPlacementCallbackHelper.cs diff --git a/src/MaterialDesignThemes.Wpf/CustomPopupPlacementCallbackHelper.cs b/src/MaterialDesignThemes.Wpf/CustomPopupPlacementCallbackHelper.cs deleted file mode 100644 index 58f3aafa59..0000000000 --- a/src/MaterialDesignThemes.Wpf/CustomPopupPlacementCallbackHelper.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MaterialDesignThemes.Wpf; - -public static class CustomPopupPlacementCallbackHelper -{ - public static readonly CustomPopupPlacementCallback LargePopupCallback; - - static CustomPopupPlacementCallbackHelper() - { - LargePopupCallback = - (size, targetSize, offset) => new[] { new CustomPopupPlacement(new Point(), PopupPrimaryAxis.Horizontal) }; - } -} diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml index cc84b241ad..b99dd3a267 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml @@ -120,8 +120,7 @@ Template="{StaticResource CalendarButtonTemplate}" /> diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml index 28b5aa51bf..d33df3e72f 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml @@ -132,8 +132,7 @@ Template="{StaticResource ClockButtonTemplate}" /> diff --git a/tests/MaterialDesignThemes.UITests/WPF/DatePickers/DatePickerTests.cs b/tests/MaterialDesignThemes.UITests/WPF/DatePickers/DatePickerTests.cs index 654642bda0..a47b6912d5 100644 --- a/tests/MaterialDesignThemes.UITests/WPF/DatePickers/DatePickerTests.cs +++ b/tests/MaterialDesignThemes.UITests/WPF/DatePickers/DatePickerTests.cs @@ -333,6 +333,35 @@ public async Task DatePicker_ShouldApplyIsMouseOverTriggers_WhenHoveringCalendar recorder.Success(); } + + [Test] + [Description("Issue 4050")] + public async Task DatePicker_PopupOpensBelowTextBoxByDefault() + { + await using var recorder = new TestRecorder(App); + + var stackPanel = await LoadXaml(""" + + + + """); + var datePicker = await stackPanel.GetElement("/DatePicker"); + var datePickerTextBox = await datePicker.GetElement("/DatePickerTextBox"); + var button = await datePicker.GetElement