Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
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
  • Loading branch information
Keboo committed Nov 7, 2024
commit e5501045dc3014af8a59107f437cf86e1236736e
48 changes: 23 additions & 25 deletions src/MaterialDesignThemes.Wpf/SliderAssist.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,64 +23,62 @@ 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",
typeof(string),
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<Slider>(repeatButton);
slider?.Focus();
slider.Focus();
}
}
#endregion
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
Expand All @@ -17,7 +17,6 @@
<Setter Property="Focusable" Value="False" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="wpf:SliderAssist.FocusParentSliderOnClick" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RepeatButton}">
Expand Down Expand Up @@ -994,6 +993,7 @@
<Setter Property="Template" Value="{StaticResource MaterialDesignDiscreteSliderHorizontal}" />
<Setter Property="UseLayoutRounding" Value="False" />
<Setter Property="wpf:ElevationAssist.Elevation" Value="Dp1" />
<Setter Property="wpf:SliderAssist.FocusSliderOnClick" Value="True" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.CheckBox.Disabled}" />
Expand All @@ -1016,6 +1016,7 @@
<Setter Property="Template" Value="{StaticResource MaterialDesignDiscreteSliderVertical}" />
<Setter Property="UseLayoutRounding" Value="False" />
<Setter Property="wpf:ElevationAssist.Elevation" Value="Dp1" />
<Setter Property="wpf:SliderAssist.FocusSliderOnClick" Value="True" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.CheckBox.Disabled}" />
Expand Down
18 changes: 0 additions & 18 deletions src/MaterialDesignThemes.Wpf/TreeHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,22 +144,4 @@ private static bool IsAncestorTill(FrameworkElement? element, object ancestor, o
}
return foundChild;
}

public static T FindParent<T>(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<T>(parentObject);
}
}
}
Loading