From d73a67efa5b3195c9b3c9cbfcdf468bb127bbac6 Mon Sep 17 00:00:00 2001 From: Corvin Date: Fri, 11 Oct 2024 23:38:12 +0200 Subject: [PATCH 1/6] (WIP) setting IsMoveToPointEnabled to false fixes the issue --- src/MainDemo.Wpf/Properties/launchSettings.json | 2 +- .../Themes/MaterialDesignTheme.Slider.xaml | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/MainDemo.Wpf/Properties/launchSettings.json b/src/MainDemo.Wpf/Properties/launchSettings.json index 3b8cbc0041..2e7192e57d 100644 --- a/src/MainDemo.Wpf/Properties/launchSettings.json +++ b/src/MainDemo.Wpf/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Demo App": { "commandName": "Project", - "commandLineArgs": "-p Home -t Inherit -f LeftToRight" + "commandLineArgs": "-p Slider -t Inherit -f LeftToRight" } } } diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml index 970f59e843..aad6f7fba1 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml @@ -985,7 +985,12 @@ - + + From f6f84747d4150de82aecf5d0a91a7c2b8a4d6249 Mon Sep 17 00:00:00 2001 From: Corvin Date: Fri, 11 Oct 2024 23:52:02 +0200 Subject: [PATCH 2/6] set IsMoveToPointEnabled=False in all Slider styles --- .../Themes/MaterialDesignTheme.Slider.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml index aad6f7fba1..e85197f64a 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml @@ -965,7 +965,7 @@ - + @@ -1012,7 +1012,7 @@ - + From e1a64878ce55897d585b16542833b21bb70690cd Mon Sep 17 00:00:00 2001 From: Corvin Szimion Date: Mon, 28 Oct 2024 11:31:32 +0100 Subject: [PATCH 3/6] added a new AP to SliderAssist to add an eventhandler to the RepeatButtons of the Slider --- src/MaterialDesignThemes.Wpf/SliderAssist.cs | 46 ++++++++++++++++++- .../Themes/MaterialDesignTheme.Slider.xaml | 10 ++-- src/MaterialDesignThemes.Wpf/TreeHelper.cs | 18 ++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/MaterialDesignThemes.Wpf/SliderAssist.cs b/src/MaterialDesignThemes.Wpf/SliderAssist.cs index e6dbe94edf..887a5d2137 100644 --- a/src/MaterialDesignThemes.Wpf/SliderAssist.cs +++ b/src/MaterialDesignThemes.Wpf/SliderAssist.cs @@ -1,4 +1,6 @@ -namespace MaterialDesignThemes.Wpf; +using System.Windows.Media; + +namespace MaterialDesignThemes.Wpf; public static class SliderAssist { @@ -39,4 +41,46 @@ public static void SetToolTipFormat(RangeBase element, string value) public static string GetToolTipFormat(RangeBase element) => (string)element.GetValue(ToolTipFormatProperty); + + #region Issue3628 + internal static readonly DependencyProperty FocusParentSliderOnClickProperty = + DependencyProperty.RegisterAttached( + "FocusParentSliderOnClick", + typeof(bool), + typeof(SliderAssist), + new PropertyMetadata(false, OnFocusParentSliderOnClickChanged)); + + internal static bool GetFocusParentSliderOnClick(DependencyObject obj) => + (bool)obj.GetValue(FocusParentSliderOnClickProperty); + + internal static void SetFocusParentSliderOnClick(DependencyObject obj, bool value) => + obj.SetValue(FocusParentSliderOnClickProperty, value); + + private static void OnFocusParentSliderOnClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is RepeatButton repeatButton) + { + if ((bool)e.NewValue) + { + repeatButton.AddHandler(UIElement.PreviewMouseLeftButtonDownEvent, + (MouseButtonEventHandler)RepeatButton_PreviewMouseLeftButtonDown, + true); + } + else + { + repeatButton.RemoveHandler(UIElement.PreviewMouseLeftButtonDownEvent, + (MouseButtonEventHandler)RepeatButton_PreviewMouseLeftButtonDown); + } + } + } + + private static void RepeatButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (sender is DependencyObject repeatButton) + { + var slider = TreeHelper.FindParent(repeatButton); + slider?.Focus(); + } + } + #endregion } diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml index e85197f64a..cb111a3566 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml @@ -17,6 +17,7 @@ + @@ -965,7 +966,7 @@ - + @@ -985,12 +986,7 @@ - - + diff --git a/src/MaterialDesignThemes.Wpf/TreeHelper.cs b/src/MaterialDesignThemes.Wpf/TreeHelper.cs index c13b2e7a33..89938e207b 100644 --- a/src/MaterialDesignThemes.Wpf/TreeHelper.cs +++ b/src/MaterialDesignThemes.Wpf/TreeHelper.cs @@ -144,4 +144,22 @@ private static bool IsAncestorTill(FrameworkElement? element, object ancestor, o } return foundChild; } + + public static T FindParent(DependencyObject child) where T : DependencyObject + { + DependencyObject parentObject = VisualTreeHelper.GetParent(child); + if (parentObject is null) + { + return null!; + } + + if (parentObject is T parent) + { + return parent; + } + else + { + return FindParent(parentObject); + } + } } From da7baa3ca8af0b7d875054a40ff71682b53abcde Mon Sep 17 00:00:00 2001 From: Corvin Szimion Date: Mon, 28 Oct 2024 11:36:00 +0100 Subject: [PATCH 4/6] Cleanup of Slider Style and launchSettings --- src/MainDemo.Wpf/Properties/launchSettings.json | 2 +- .../Themes/MaterialDesignTheme.Slider.xaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MainDemo.Wpf/Properties/launchSettings.json b/src/MainDemo.Wpf/Properties/launchSettings.json index 2e7192e57d..3b8cbc0041 100644 --- a/src/MainDemo.Wpf/Properties/launchSettings.json +++ b/src/MainDemo.Wpf/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Demo App": { "commandName": "Project", - "commandLineArgs": "-p Slider -t Inherit -f LeftToRight" + "commandLineArgs": "-p Home -t Inherit -f LeftToRight" } } } diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml index cb111a3566..f1efbdf78b 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml @@ -1008,7 +1008,7 @@ - + From e5501045dc3014af8a59107f437cf86e1236736e Mon Sep 17 00:00:00 2001 From: Kevin Bost Date: Wed, 6 Nov 2024 23:04:10 -0800 Subject: [PATCH 5/6] Moving assist to be on the slider itself This allow fixes it when the slider has a background color, or the user clicks on the ticks above/below the track --- src/MaterialDesignThemes.Wpf/SliderAssist.cs | 48 +++++++++---------- .../Themes/MaterialDesignTheme.Slider.xaml | 5 +- src/MaterialDesignThemes.Wpf/TreeHelper.cs | 18 ------- 3 files changed, 26 insertions(+), 45 deletions(-) diff --git a/src/MaterialDesignThemes.Wpf/SliderAssist.cs b/src/MaterialDesignThemes.Wpf/SliderAssist.cs index 887a5d2137..c7e174f6d6 100644 --- a/src/MaterialDesignThemes.Wpf/SliderAssist.cs +++ b/src/MaterialDesignThemes.Wpf/SliderAssist.cs @@ -23,12 +23,12 @@ public static readonly DependencyProperty OnlyShowFocusVisualWhileDraggingProper typeof(SliderAssist), new PropertyMetadata(false)); - public static void SetOnlyShowFocusVisualWhileDragging(RangeBase element, bool value) - => element.SetValue(OnlyShowFocusVisualWhileDraggingProperty, value); - public static bool GetOnlyShowFocusVisualWhileDragging(RangeBase element) => (bool)element.GetValue(OnlyShowFocusVisualWhileDraggingProperty); + public static void SetOnlyShowFocusVisualWhileDragging(RangeBase element, bool value) + => element.SetValue(OnlyShowFocusVisualWhileDraggingProperty, value); + public static readonly DependencyProperty ToolTipFormatProperty = DependencyProperty.RegisterAttached( "ToolTipFormat", @@ -36,51 +36,49 @@ public static readonly DependencyProperty ToolTipFormatProperty typeof(SliderAssist), new PropertyMetadata(null)); - public static void SetToolTipFormat(RangeBase element, string value) - => element.SetValue(ToolTipFormatProperty, value); - public static string GetToolTipFormat(RangeBase element) => (string)element.GetValue(ToolTipFormatProperty); - #region Issue3628 - internal static readonly DependencyProperty FocusParentSliderOnClickProperty = + public static void SetToolTipFormat(RangeBase element, string value) + => element.SetValue(ToolTipFormatProperty, value); + + // Fix for Issue3628 + public static readonly DependencyProperty FocusSliderOnClickProperty = DependencyProperty.RegisterAttached( - "FocusParentSliderOnClick", + "FocusSliderOnClick", typeof(bool), typeof(SliderAssist), - new PropertyMetadata(false, OnFocusParentSliderOnClickChanged)); + new PropertyMetadata(false, OnFocusSliderOnClickChanged)); - internal static bool GetFocusParentSliderOnClick(DependencyObject obj) => - (bool)obj.GetValue(FocusParentSliderOnClickProperty); + public static bool GetFocusSliderOnClick(RangeBase obj) => + (bool)obj.GetValue(FocusSliderOnClickProperty); - internal static void SetFocusParentSliderOnClick(DependencyObject obj, bool value) => - obj.SetValue(FocusParentSliderOnClickProperty, value); + public static void SetFocusSliderOnClick(RangeBase obj, bool value) => + obj.SetValue(FocusSliderOnClickProperty, value); - private static void OnFocusParentSliderOnClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + private static void OnFocusSliderOnClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is RepeatButton repeatButton) + if (d is Slider slider) { if ((bool)e.NewValue) { - repeatButton.AddHandler(UIElement.PreviewMouseLeftButtonDownEvent, - (MouseButtonEventHandler)RepeatButton_PreviewMouseLeftButtonDown, + slider.AddHandler(UIElement.PreviewMouseLeftButtonDownEvent, + (MouseButtonEventHandler)Slider_PreviewMouseLeftButtonDown, true); } else { - repeatButton.RemoveHandler(UIElement.PreviewMouseLeftButtonDownEvent, - (MouseButtonEventHandler)RepeatButton_PreviewMouseLeftButtonDown); + slider.RemoveHandler(UIElement.PreviewMouseLeftButtonDownEvent, + (MouseButtonEventHandler)Slider_PreviewMouseLeftButtonDown); } } } - private static void RepeatButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + private static void Slider_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { - if (sender is DependencyObject repeatButton) + if (sender is Slider slider) { - var slider = TreeHelper.FindParent(repeatButton); - slider?.Focus(); + slider.Focus(); } } - #endregion } diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml index f1efbdf78b..53a3334493 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml @@ -1,4 +1,4 @@ - @@ -17,7 +17,6 @@ - @@ -994,6 +993,7 @@ + @@ -1016,6 +1016,7 @@ + diff --git a/src/MaterialDesignThemes.Wpf/TreeHelper.cs b/src/MaterialDesignThemes.Wpf/TreeHelper.cs index 89938e207b..c13b2e7a33 100644 --- a/src/MaterialDesignThemes.Wpf/TreeHelper.cs +++ b/src/MaterialDesignThemes.Wpf/TreeHelper.cs @@ -144,22 +144,4 @@ private static bool IsAncestorTill(FrameworkElement? element, object ancestor, o } return foundChild; } - - public static T FindParent(DependencyObject child) where T : DependencyObject - { - DependencyObject parentObject = VisualTreeHelper.GetParent(child); - if (parentObject is null) - { - return null!; - } - - if (parentObject is T parent) - { - return parent; - } - else - { - return FindParent(parentObject); - } - } } From 1ada39520d4a912c7a490e88115466578f7aa294 Mon Sep 17 00:00:00 2001 From: Kevin Bost Date: Wed, 13 Nov 2024 22:16:55 -0800 Subject: [PATCH 6/6] Adding retry to flaky test --- .../WPF/TextBoxes/TextBoxTests.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs b/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs index 8a7be36c8c..6066e1387a 100644 --- a/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs +++ b/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs @@ -318,9 +318,12 @@ public async Task ContextMenu_FollowsTextBoxFontFamily() var contextMenu = await textBox.GetElement(".ContextMenu"); - var textBoxFont = await textBox.GetFontFamily(); - Assert.Equal("Times New Roman", textBoxFont?.FamilyNames.Values.First()); - Assert.Equal(textBoxFont, await contextMenu.GetFontFamily()); + FontFamily? textBoxFont = await textBox.GetFontFamily(); + Assert.Contains("Times New Roman", textBoxFont?.FamilyNames.Values ?? []); + await Wait.For(async () => + { + Assert.Equal(textBoxFont, await contextMenu.GetFontFamily()); + }); recorder.Success(); }