Skip to content

Commit e1a6487

Browse files
author
Corvin Szimion
committed
added a new AP to SliderAssist to add an eventhandler to the RepeatButtons of the Slider
1 parent f6f8474 commit e1a6487

File tree

3 files changed

+66
-8
lines changed

3 files changed

+66
-8
lines changed

src/MaterialDesignThemes.Wpf/SliderAssist.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace MaterialDesignThemes.Wpf;
1+
using System.Windows.Media;
2+
3+
namespace MaterialDesignThemes.Wpf;
24

35
public static class SliderAssist
46
{
@@ -39,4 +41,46 @@ public static void SetToolTipFormat(RangeBase element, string value)
3941

4042
public static string GetToolTipFormat(RangeBase element)
4143
=> (string)element.GetValue(ToolTipFormatProperty);
44+
45+
#region Issue3628
46+
internal static readonly DependencyProperty FocusParentSliderOnClickProperty =
47+
DependencyProperty.RegisterAttached(
48+
"FocusParentSliderOnClick",
49+
typeof(bool),
50+
typeof(SliderAssist),
51+
new PropertyMetadata(false, OnFocusParentSliderOnClickChanged));
52+
53+
internal static bool GetFocusParentSliderOnClick(DependencyObject obj) =>
54+
(bool)obj.GetValue(FocusParentSliderOnClickProperty);
55+
56+
internal static void SetFocusParentSliderOnClick(DependencyObject obj, bool value) =>
57+
obj.SetValue(FocusParentSliderOnClickProperty, value);
58+
59+
private static void OnFocusParentSliderOnClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
60+
{
61+
if (d is RepeatButton repeatButton)
62+
{
63+
if ((bool)e.NewValue)
64+
{
65+
repeatButton.AddHandler(UIElement.PreviewMouseLeftButtonDownEvent,
66+
(MouseButtonEventHandler)RepeatButton_PreviewMouseLeftButtonDown,
67+
true);
68+
}
69+
else
70+
{
71+
repeatButton.RemoveHandler(UIElement.PreviewMouseLeftButtonDownEvent,
72+
(MouseButtonEventHandler)RepeatButton_PreviewMouseLeftButtonDown);
73+
}
74+
}
75+
}
76+
77+
private static void RepeatButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
78+
{
79+
if (sender is DependencyObject repeatButton)
80+
{
81+
var slider = TreeHelper.FindParent<Slider>(repeatButton);
82+
slider?.Focus();
83+
}
84+
}
85+
#endregion
4286
}

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Slider.xaml

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<Setter Property="Focusable" Value="False" />
1818
<Setter Property="IsTabStop" Value="False" />
1919
<Setter Property="OverridesDefaultStyle" Value="True" />
20+
<Setter Property="wpf:SliderAssist.FocusParentSliderOnClick" Value="True"/>
2021
<Setter Property="Template">
2122
<Setter.Value>
2223
<ControlTemplate TargetType="{x:Type RepeatButton}">
@@ -965,7 +966,7 @@
965966
<Setter Property="BorderBrush" Value="Transparent" />
966967
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
967968
<Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Primary}" />
968-
<Setter Property="IsMoveToPointEnabled" Value="False" />
969+
<Setter Property="IsMoveToPointEnabled" Value="True" />
969970
<Setter Property="SnapsToDevicePixels" Value="False" />
970971
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false" />
971972
<Setter Property="Template" Value="{StaticResource MaterialDesignSliderHorizontal}" />
@@ -985,12 +986,7 @@
985986
<Setter Property="Background" Value="{x:Null}" />
986987
<Setter Property="BorderBrush" Value="Transparent" />
987988
<Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Primary}" />
988-
<!--
989-
When IsMoveToPointEnabled is true, additional code is being executed before the actual "base.OnPreviewMouseLeftButtonDown(e);"
990-
in which the event is marked as handled, i suspect this is the issue, see:
991-
https://source.dot.net/#PresentationFramework/System/Windows/Controls/Slider.cs,771
992-
-->
993-
<Setter Property="IsMoveToPointEnabled" Value="False" />
989+
<Setter Property="IsMoveToPointEnabled" Value="True" />
994990
<Setter Property="IsSnapToTickEnabled" Value="True" />
995991
<Setter Property="Orientation" Value="Horizontal" />
996992
<Setter Property="SnapsToDevicePixels" Value="False" />

src/MaterialDesignThemes.Wpf/TreeHelper.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,22 @@ private static bool IsAncestorTill(FrameworkElement? element, object ancestor, o
144144
}
145145
return foundChild;
146146
}
147+
148+
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
149+
{
150+
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
151+
if (parentObject is null)
152+
{
153+
return null!;
154+
}
155+
156+
if (parentObject is T parent)
157+
{
158+
return parent;
159+
}
160+
else
161+
{
162+
return FindParent<T>(parentObject);
163+
}
164+
}
147165
}

0 commit comments

Comments
 (0)