fix:issue #153
This commit is contained in:
+108
-114
@@ -2299,61 +2299,44 @@ namespace Ink_Canvas
|
|||||||
// 启用触摸和手写笔支持
|
// 启用触摸和手写笔支持
|
||||||
slider.IsManipulationEnabled = true;
|
slider.IsManipulationEnabled = true;
|
||||||
|
|
||||||
// 添加触摸事件
|
// 添加触摸事件 - 使用更简单直接的方法
|
||||||
slider.TouchDown += Slider_TouchDown;
|
slider.TouchDown += (s, e) => HandleSliderTouch(s, e, slider);
|
||||||
slider.TouchMove += Slider_TouchMove;
|
slider.TouchMove += (s, e) => HandleSliderTouch(s, e, slider);
|
||||||
slider.TouchUp += Slider_TouchUp;
|
slider.TouchUp += (s, e) => HandleSliderTouchEnd(s, e, slider);
|
||||||
|
|
||||||
// 添加手写笔事件
|
// 添加手写笔事件
|
||||||
slider.StylusDown += Slider_StylusDown;
|
slider.StylusDown += (s, e) => HandleSliderStylus(s, e, slider);
|
||||||
slider.StylusMove += Slider_StylusMove;
|
slider.StylusMove += (s, e) => HandleSliderStylus(s, e, slider);
|
||||||
slider.StylusUp += Slider_StylusUp;
|
slider.StylusUp += (s, e) => HandleSliderStylusEnd(s, e, slider);
|
||||||
|
|
||||||
// 添加操作事件(用于更精确的触摸控制)
|
|
||||||
slider.ManipulationStarted += Slider_ManipulationStarted;
|
|
||||||
slider.ManipulationDelta += Slider_ManipulationDelta;
|
|
||||||
slider.ManipulationCompleted += Slider_ManipulationCompleted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 滑块触摸按下事件处理
|
/// 处理滑块触摸事件(按下和移动)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void Slider_TouchDown(object sender, TouchEventArgs e)
|
private void HandleSliderTouch(object sender, TouchEventArgs e, Slider slider)
|
||||||
{
|
{
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
if (slider == null) return;
|
||||||
|
|
||||||
// 捕获触摸设备
|
// 捕获触摸设备
|
||||||
slider.CaptureTouch(e.TouchDevice);
|
if (e.RoutedEvent == UIElement.TouchDownEvent)
|
||||||
|
{
|
||||||
|
slider.CaptureTouch(e.TouchDevice);
|
||||||
|
}
|
||||||
|
|
||||||
// 计算触摸位置对应的滑块值
|
// 计算触摸位置对应的滑块值
|
||||||
var touchPoint = e.GetTouchPoint(slider);
|
var touchPoint = e.GetTouchPoint(slider);
|
||||||
UpdateSliderValueFromPosition(slider, touchPoint.Position);
|
|
||||||
|
// 使用更精确的位置计算方法
|
||||||
|
UpdateSliderValueFromPositionImproved(slider, touchPoint.Position);
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 滑块触摸移动事件处理
|
/// 处理滑块触摸结束事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void Slider_TouchMove(object sender, TouchEventArgs e)
|
private void HandleSliderTouchEnd(object sender, TouchEventArgs e, Slider slider)
|
||||||
{
|
{
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
|
||||||
|
|
||||||
// 计算触摸位置对应的滑块值
|
|
||||||
var touchPoint = e.GetTouchPoint(slider);
|
|
||||||
UpdateSliderValueFromPosition(slider, touchPoint.Position);
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 滑块触摸释放事件处理
|
|
||||||
/// </summary>
|
|
||||||
private void Slider_TouchUp(object sender, TouchEventArgs e)
|
|
||||||
{
|
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
if (slider == null) return;
|
||||||
|
|
||||||
// 释放触摸捕获
|
// 释放触摸捕获
|
||||||
@@ -2363,50 +2346,33 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 滑块手写笔按下事件处理
|
/// 处理滑块手写笔事件(按下和移动)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void Slider_StylusDown(object sender, StylusDownEventArgs e)
|
private void HandleSliderStylus(object sender, StylusEventArgs e, Slider slider)
|
||||||
{
|
{
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
if (slider == null) return;
|
||||||
|
|
||||||
// 捕获手写笔设备
|
// 捕获手写笔设备
|
||||||
slider.CaptureStylus();
|
if (e.RoutedEvent == UIElement.StylusDownEvent)
|
||||||
|
{
|
||||||
|
slider.CaptureStylus();
|
||||||
|
}
|
||||||
|
|
||||||
// 计算手写笔位置对应的滑块值
|
// 计算手写笔位置对应的滑块值
|
||||||
var stylusPoint = e.GetStylusPoints(slider);
|
var stylusPoint = e.GetStylusPoints(slider);
|
||||||
if (stylusPoint.Count > 0)
|
if (stylusPoint.Count > 0)
|
||||||
{
|
{
|
||||||
UpdateSliderValueFromPosition(slider, stylusPoint[0].ToPoint());
|
UpdateSliderValueFromPositionImproved(slider, stylusPoint[0].ToPoint());
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 滑块手写笔移动事件处理
|
/// 处理滑块手写笔结束事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void Slider_StylusMove(object sender, StylusEventArgs e)
|
private void HandleSliderStylusEnd(object sender, StylusEventArgs e, Slider slider)
|
||||||
{
|
{
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null || !slider.IsStylusCaptured) return;
|
|
||||||
|
|
||||||
// 计算手写笔位置对应的滑块值
|
|
||||||
var stylusPoint = e.GetStylusPoints(slider);
|
|
||||||
if (stylusPoint.Count > 0)
|
|
||||||
{
|
|
||||||
UpdateSliderValueFromPosition(slider, stylusPoint[0].ToPoint());
|
|
||||||
}
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 滑块手写笔释放事件处理
|
|
||||||
/// </summary>
|
|
||||||
private void Slider_StylusUp(object sender, StylusEventArgs e)
|
|
||||||
{
|
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
if (slider == null) return;
|
||||||
|
|
||||||
// 释放手写笔捕获
|
// 释放手写笔捕获
|
||||||
@@ -2416,44 +2382,75 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 滑块操作开始事件处理
|
/// 根据触摸/手写笔位置更新滑块值(改进版本)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void Slider_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
|
/// <param name="slider">滑块控件</param>
|
||||||
|
/// <param name="position">触摸/手写笔位置</param>
|
||||||
|
private void UpdateSliderValueFromPositionImproved(Slider slider, Point position)
|
||||||
{
|
{
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
if (slider == null) return;
|
||||||
|
|
||||||
e.Handled = true;
|
try
|
||||||
|
{
|
||||||
|
// 获取滑块的轨道元素
|
||||||
|
var track = slider.Template.FindName("PART_Track", slider) as Track;
|
||||||
|
if (track == null)
|
||||||
|
{
|
||||||
|
// 如果找不到轨道,使用简单方法
|
||||||
|
UpdateSliderValueFromPosition(slider, position);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取轨道的实际边界
|
||||||
|
var trackBounds = track.TransformToAncestor(slider).TransformBounds(new Rect(0, 0, track.ActualWidth, track.ActualHeight));
|
||||||
|
|
||||||
|
double relativePosition = 0;
|
||||||
|
|
||||||
|
if (slider.Orientation == System.Windows.Controls.Orientation.Horizontal)
|
||||||
|
{
|
||||||
|
// 水平滑块
|
||||||
|
if (trackBounds.Width > 0)
|
||||||
|
{
|
||||||
|
// 计算相对于轨道的相对位置
|
||||||
|
var relativeX = position.X - trackBounds.X;
|
||||||
|
relativePosition = Math.Max(0, Math.Min(1, relativeX / trackBounds.Width));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 垂直滑块
|
||||||
|
if (trackBounds.Height > 0)
|
||||||
|
{
|
||||||
|
// 计算相对于轨道的相对位置
|
||||||
|
var relativeY = position.Y - trackBounds.Y;
|
||||||
|
relativePosition = Math.Max(0, Math.Min(1, relativeY / trackBounds.Height));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算新的滑块值
|
||||||
|
var newValue = slider.Minimum + relativePosition * (slider.Maximum - slider.Minimum);
|
||||||
|
|
||||||
|
// 如果启用了吸附到刻度,则调整到最近的刻度
|
||||||
|
if (slider.IsSnapToTickEnabled && slider.TickFrequency > 0)
|
||||||
|
{
|
||||||
|
var tickCount = (int)((slider.Maximum - slider.Minimum) / slider.TickFrequency);
|
||||||
|
var tickIndex = (int)Math.Round(relativePosition * tickCount);
|
||||||
|
newValue = slider.Minimum + tickIndex * slider.TickFrequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新滑块值
|
||||||
|
slider.Value = Math.Max(slider.Minimum, Math.Min(slider.Maximum, newValue));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// 如果改进方法失败,回退到简单方法
|
||||||
|
UpdateSliderValueFromPosition(slider, position);
|
||||||
|
LogHelper.WriteLogToFile($"更新滑块值时出错,使用回退方法: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 滑块操作变化事件处理
|
/// 根据触摸/手写笔位置更新滑块值(简单版本)
|
||||||
/// </summary>
|
|
||||||
private void Slider_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
|
|
||||||
{
|
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
|
||||||
|
|
||||||
// 计算操作位置对应的滑块值
|
|
||||||
var manipulationOrigin = e.ManipulationOrigin;
|
|
||||||
UpdateSliderValueFromPosition(slider, manipulationOrigin);
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 滑块操作完成事件处理
|
|
||||||
/// </summary>
|
|
||||||
private void Slider_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
|
|
||||||
{
|
|
||||||
var slider = sender as Slider;
|
|
||||||
if (slider == null) return;
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 根据触摸/手写笔位置更新滑块值
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="slider">滑块控件</param>
|
/// <param name="slider">滑块控件</param>
|
||||||
/// <param name="position">触摸/手写笔位置</param>
|
/// <param name="position">触摸/手写笔位置</param>
|
||||||
@@ -2463,36 +2460,33 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 计算滑块轨道的位置和长度
|
// 使用更简单直接的方法计算滑块值
|
||||||
var track = slider.Template.FindName("PART_Track", slider) as Track;
|
|
||||||
if (track == null) return;
|
|
||||||
|
|
||||||
var thumb = track.Thumb;
|
|
||||||
if (thumb == null) return;
|
|
||||||
|
|
||||||
// 获取滑块轨道的实际渲染位置
|
|
||||||
track.Arrange(new Rect(track.DesiredSize));
|
|
||||||
thumb.Arrange(new Rect(thumb.DesiredSize));
|
|
||||||
|
|
||||||
// 计算相对位置(0-1之间)
|
|
||||||
double relativePosition = 0;
|
double relativePosition = 0;
|
||||||
|
|
||||||
if (slider.Orientation == System.Windows.Controls.Orientation.Horizontal)
|
if (slider.Orientation == System.Windows.Controls.Orientation.Horizontal)
|
||||||
{
|
{
|
||||||
// 水平滑块
|
// 水平滑块 - 使用滑块的实际宽度
|
||||||
var trackWidth = track.ActualWidth;
|
var sliderWidth = slider.ActualWidth;
|
||||||
if (trackWidth > 0)
|
if (sliderWidth > 0)
|
||||||
{
|
{
|
||||||
relativePosition = Math.Max(0, Math.Min(1, position.X / trackWidth));
|
// 考虑滑块的边距和拇指大小
|
||||||
|
var thumbSize = 20; // 假设拇指大小约为20像素
|
||||||
|
var effectiveWidth = sliderWidth - thumbSize;
|
||||||
|
var adjustedX = position.X - thumbSize / 2;
|
||||||
|
relativePosition = Math.Max(0, Math.Min(1, adjustedX / effectiveWidth));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 垂直滑块
|
// 垂直滑块 - 使用滑块的实际高度
|
||||||
var trackHeight = track.ActualHeight;
|
var sliderHeight = slider.ActualHeight;
|
||||||
if (trackHeight > 0)
|
if (sliderHeight > 0)
|
||||||
{
|
{
|
||||||
relativePosition = Math.Max(0, Math.Min(1, position.Y / trackHeight));
|
// 考虑滑块的边距和拇指大小
|
||||||
|
var thumbSize = 20; // 假设拇指大小约为20像素
|
||||||
|
var effectiveHeight = sliderHeight - thumbSize;
|
||||||
|
var adjustedY = position.Y - thumbSize / 2;
|
||||||
|
relativePosition = Math.Max(0, Math.Min(1, adjustedY / effectiveHeight));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -894,8 +894,13 @@ namespace Ink_Canvas.Windows {
|
|||||||
var trackWidth = customSlider.TrackBorder.ActualWidth;
|
var trackWidth = customSlider.TrackBorder.ActualWidth;
|
||||||
if (trackWidth <= 0) return;
|
if (trackWidth <= 0) return;
|
||||||
|
|
||||||
// 计算相对位置(0-1之间)
|
// 考虑拇指大小,计算有效轨道长度
|
||||||
var relativePosition = Math.Max(0, Math.Min(1, position.X / trackWidth));
|
var thumbSize = 21; // 根据XAML中的Width="21"
|
||||||
|
var effectiveWidth = trackWidth - thumbSize;
|
||||||
|
|
||||||
|
// 计算相对位置(0-1之间),考虑拇指大小
|
||||||
|
var adjustedX = position.X - thumbSize / 2;
|
||||||
|
var relativePosition = Math.Max(0, Math.Min(1, adjustedX / effectiveWidth));
|
||||||
|
|
||||||
// 更新滑块位置
|
// 更新滑块位置
|
||||||
var thumbTransform = customSlider.ThumbImage.RenderTransform as TranslateTransform;
|
var thumbTransform = customSlider.ThumbImage.RenderTransform as TranslateTransform;
|
||||||
@@ -906,7 +911,7 @@ namespace Ink_Canvas.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 计算新的滑块位置
|
// 计算新的滑块位置
|
||||||
var newX = relativePosition * trackWidth;
|
var newX = relativePosition * effectiveWidth;
|
||||||
thumbTransform.X = newX;
|
thumbTransform.X = newX;
|
||||||
|
|
||||||
// 更新值显示Border的宽度
|
// 更新值显示Border的宽度
|
||||||
|
|||||||
Reference in New Issue
Block a user