improve:墨迹渐隐
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user