improve:墨迹渐隐

This commit is contained in:
2025-09-06 13:16:10 +08:00
parent 41bcae9d05
commit 1a9ddf1969
6 changed files with 757 additions and 65 deletions
+292 -2
View File
@@ -16,6 +16,7 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Forms;
using System.Windows.Ink;
using System.Windows.Input;
@@ -246,6 +247,9 @@ namespace Ink_Canvas
// 为浮动栏按钮添加触摸事件支持
AddTouchSupportToFloatingBarButtons();
// 为滑块控件添加触摸事件支持
AddTouchSupportToSliders();
}
@@ -1755,6 +1759,9 @@ namespace Ink_Canvas
// 先设置WPF的Topmost属性
Topmost = true;
// 立即应用置顶
WindowZOrderManager.BringToTop(this);
// 如果启用了无焦点模式,需要特殊处理
if (Settings.Advanced.IsNoFocusMode)
{
@@ -1847,8 +1854,8 @@ namespace Ink_Canvas
// 检查是否有子窗口在前景
if (!WindowZOrderManager.HasChildWindowInForeground())
{
// 没有子窗口在前景,重新应用Z-Order
WindowZOrderManager.SetWindowTopmost(this, true);
// 没有子窗口在前景,强制刷新所有窗口的置顶状态
WindowZOrderManager.ForceRefreshAllWindows();
}
}
catch (Exception ex)
@@ -2227,5 +2234,288 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile($"设置工具模式时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
#region
/// <summary>
/// 为所有滑块控件添加触摸和手写笔事件支持
/// </summary>
private void AddTouchSupportToSliders()
{
try
{
// 获取所有滑块控件并添加触摸支持
var sliders = new List<Slider>
{
InkFadeTimeSlider,
AutoStraightenLineThresholdSlider,
LineStraightenSensitivitySlider,
LineEndpointSnappingThresholdSlider,
ViewboxFloatingBarScaleTransformValueSlider,
ViewboxFloatingBarOpacityValueSlider,
ViewboxFloatingBarOpacityInPPTValueSlider,
PPTButtonLeftPositionValueSlider,
PPTButtonRightPositionValueSlider,
PPTButtonLBPositionValueSlider,
PPTButtonRBPositionValueSlider,
TouchMultiplierSlider,
NibModeBoundsWidthSlider,
FingerModeBoundsWidthSlider,
SideControlMinimumAutomationSlider,
RandWindowOnceCloseLatencySlider,
RandWindowOnceMaxStudentsSlider,
BoardInkWidthSlider,
BoardInkAlphaSlider,
BoardHighlighterWidthSlider,
InkWidthSlider,
InkAlphaSlider,
HighlighterWidthSlider
};
foreach (var slider in sliders)
{
if (slider != null)
{
AddTouchSupportToSlider(slider);
}
}
LogHelper.WriteLogToFile("已为所有滑块控件添加触摸支持", LogHelper.LogType.Trace);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"添加滑块触摸支持时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
/// <summary>
/// 为单个滑块控件添加触摸和手写笔事件支持
/// </summary>
/// <param name="slider">要添加触摸支持的滑块控件</param>
private void AddTouchSupportToSlider(Slider slider)
{
if (slider == null) return;
// 启用触摸和手写笔支持
slider.IsManipulationEnabled = true;
// 添加触摸事件
slider.TouchDown += Slider_TouchDown;
slider.TouchMove += Slider_TouchMove;
slider.TouchUp += Slider_TouchUp;
// 添加手写笔事件
slider.StylusDown += Slider_StylusDown;
slider.StylusMove += Slider_StylusMove;
slider.StylusUp += Slider_StylusUp;
// 添加操作事件(用于更精确的触摸控制)
slider.ManipulationStarted += Slider_ManipulationStarted;
slider.ManipulationDelta += Slider_ManipulationDelta;
slider.ManipulationCompleted += Slider_ManipulationCompleted;
}
/// <summary>
/// 滑块触摸按下事件处理
/// </summary>
private void Slider_TouchDown(object sender, TouchEventArgs e)
{
var slider = sender as Slider;
if (slider == null) return;
// 捕获触摸设备
slider.CaptureTouch(e.TouchDevice);
// 计算触摸位置对应的滑块值
var touchPoint = e.GetTouchPoint(slider);
UpdateSliderValueFromPosition(slider, touchPoint.Position);
e.Handled = true;
}
/// <summary>
/// 滑块触摸移动事件处理
/// </summary>
private void Slider_TouchMove(object sender, TouchEventArgs e)
{
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;
// 释放触摸捕获
slider.ReleaseTouchCapture(e.TouchDevice);
e.Handled = true;
}
/// <summary>
/// 滑块手写笔按下事件处理
/// </summary>
private void Slider_StylusDown(object sender, StylusDownEventArgs e)
{
var slider = sender as Slider;
if (slider == null) return;
// 捕获手写笔设备
slider.CaptureStylus();
// 计算手写笔位置对应的滑块值
var stylusPoint = e.GetStylusPoints(slider);
if (stylusPoint.Count > 0)
{
UpdateSliderValueFromPosition(slider, stylusPoint[0].ToPoint());
}
e.Handled = true;
}
/// <summary>
/// 滑块手写笔移动事件处理
/// </summary>
private void Slider_StylusMove(object sender, StylusEventArgs e)
{
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;
// 释放手写笔捕获
slider.ReleaseStylusCapture();
e.Handled = true;
}
/// <summary>
/// 滑块操作开始事件处理
/// </summary>
private void Slider_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
var slider = sender as Slider;
if (slider == null) return;
e.Handled = true;
}
/// <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>
/// <param name="slider">滑块控件</param>
/// <param name="position">触摸/手写笔位置</param>
private void UpdateSliderValueFromPosition(Slider slider, Point position)
{
if (slider == null) return;
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;
if (slider.Orientation == System.Windows.Controls.Orientation.Horizontal)
{
// 水平滑块
var trackWidth = track.ActualWidth;
if (trackWidth > 0)
{
relativePosition = Math.Max(0, Math.Min(1, position.X / trackWidth));
}
}
else
{
// 垂直滑块
var trackHeight = track.ActualHeight;
if (trackHeight > 0)
{
relativePosition = Math.Max(0, Math.Min(1, position.Y / trackHeight));
}
}
// 计算新的滑块值
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)
{
LogHelper.WriteLogToFile($"更新滑块值时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
#endregion
}
}