From 80e1252320b04ce48d1bbf498eba54ce1d3f0b8f Mon Sep 17 00:00:00 2001 From: ajaysenday Date: Tue, 9 Jun 2026 05:50:52 +0000 Subject: [PATCH] Fix font scaling slider not working on touchscreens Drive the slider value from touch events so the thumb follows the finger; WPF sliders only respond to mouse drag otherwise. --- .../private/Set-WinUtilSliderFromTouch.ps1 | 22 +++++++++++++++++++ scripts/main.ps1 | 22 +++++++++++++++++++ xaml/inputXML.xaml | 2 ++ 3 files changed, 46 insertions(+) create mode 100644 functions/private/Set-WinUtilSliderFromTouch.ps1 diff --git a/functions/private/Set-WinUtilSliderFromTouch.ps1 b/functions/private/Set-WinUtilSliderFromTouch.ps1 new file mode 100644 index 0000000000..80082b4601 --- /dev/null +++ b/functions/private/Set-WinUtilSliderFromTouch.ps1 @@ -0,0 +1,22 @@ +function Set-WinUtilSliderFromTouch { + <# + .SYNOPSIS + Moves a Slider's value to a horizontal touch position. WPF Sliders ignore touch drag on touch-only devices, so this is wired up to the touch events manually. + #> + param ( + [Parameter(Mandatory)] $Slider, + [Parameter(Mandatory)] [double]$PositionX + ) + + if ($Slider.ActualWidth -le 0) { return } + + $ratio = [math]::Min(1, [math]::Max(0, $PositionX / $Slider.ActualWidth)) + $value = $Slider.Minimum + ($ratio * ($Slider.Maximum - $Slider.Minimum)) + + if ($Slider.TickFrequency -gt 0) { + $steps = [math]::Round(($value - $Slider.Minimum) / $Slider.TickFrequency) + $value = $Slider.Minimum + ($steps * $Slider.TickFrequency) + } + + $Slider.Value = $value +} diff --git a/scripts/main.ps1 b/scripts/main.ps1 index 5e72b1e67a..dea63ff524 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -525,6 +525,28 @@ $sync["FontScalingSlider"].Add_ValueChanged({ $sync.FontScalingValue.Text = "$percentage%" }) +# WPF sliders don't respond to touch drag, so drive the value from touch events +$sync["FontScalingSlider"].Add_PreviewTouchDown({ + param($slider, $e) + $slider.CaptureTouch($e.TouchDevice) | Out-Null + Set-WinUtilSliderFromTouch -Slider $slider -PositionX $e.GetTouchPoint($slider).Position.X + $e.Handled = $true +}) + +$sync["FontScalingSlider"].Add_PreviewTouchMove({ + param($slider, $e) + if ($slider.AreAnyTouchesCaptured) { + Set-WinUtilSliderFromTouch -Slider $slider -PositionX $e.GetTouchPoint($slider).Position.X + $e.Handled = $true + } +}) + +$sync["FontScalingSlider"].Add_PreviewTouchUp({ + param($slider, $e) + $slider.ReleaseTouchCapture($e.TouchDevice) | Out-Null + $e.Handled = $true +}) + $sync["FontScalingResetButton"].Add_Click({ $sync.FontScalingSlider.Value = 1.0 $sync.FontScalingValue.Text = "100%" diff --git a/xaml/inputXML.xaml b/xaml/inputXML.xaml index fa272d91ae..4deba851ce 100644 --- a/xaml/inputXML.xaml +++ b/xaml/inputXML.xaml @@ -1121,6 +1121,8 @@ TickFrequency="0.25" TickPlacement="BottomRight" IsSnapToTickEnabled="True" + IsMoveToPointEnabled="True" + Stylus.IsPressAndHoldEnabled="False" Width="120" VerticalAlignment="Center"/>