diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml
index c3d39ff..8cecc89 100644
--- a/Ink Canvas/MainWindow.xaml
+++ b/Ink Canvas/MainWindow.xaml
@@ -1997,7 +1997,7 @@
-
+
diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs
index 7ed977c..9b63246 100644
--- a/Ink Canvas/MainWindow_cs/MW_Settings.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs
@@ -510,9 +510,31 @@ namespace Ink_Canvas {
ToggleSwitchEnableMultiTouchMode.IsOn = BoardToggleSwitchEnableMultiTouchMode.IsOn;
}
if (ToggleSwitchEnableMultiTouchMode.IsOn) {
- if (!isInMultiTouchMode) BorderMultiTouchMode_MouseUp(null, null);
+ if (!isInMultiTouchMode)
+ {
+ inkCanvas.StylusDown += MainWindow_StylusDown;
+ inkCanvas.StylusMove += MainWindow_StylusMove;
+ inkCanvas.StylusUp += MainWindow_StylusUp;
+ inkCanvas.TouchDown += MainWindow_TouchDown;
+ inkCanvas.TouchDown -= Main_Grid_TouchDown;
+ inkCanvas.EditingMode = InkCanvasEditingMode.None;
+ inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
+ inkCanvas.Children.Clear();
+ isInMultiTouchMode = true;
+ }
} else {
- if (isInMultiTouchMode) BorderMultiTouchMode_MouseUp(null, null);
+ if (isInMultiTouchMode)
+ {
+ inkCanvas.StylusDown -= MainWindow_StylusDown;
+ inkCanvas.StylusMove -= MainWindow_StylusMove;
+ inkCanvas.StylusUp -= MainWindow_StylusUp;
+ inkCanvas.TouchDown -= MainWindow_TouchDown;
+ inkCanvas.TouchDown += Main_Grid_TouchDown;
+ inkCanvas.EditingMode = InkCanvasEditingMode.None;
+ inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
+ inkCanvas.Children.Clear();
+ isInMultiTouchMode = false;
+ }
}
Settings.Gesture.IsEnableMultiTouchMode = ToggleSwitchEnableMultiTouchMode.IsOn;
CheckEnableTwoFingerGestureBtnColorPrompt();
diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs
index 4bf754d..1944154 100644
--- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs
+++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs
@@ -10,13 +10,17 @@ using System.Windows.Input;
using System.Windows.Media;
using Point = System.Windows.Point;
-namespace Ink_Canvas {
- public partial class MainWindow : Window {
+namespace Ink_Canvas
+{
+ public partial class MainWindow : Window
+ {
#region Multi-Touch
bool isInMultiTouchMode = false;
- private void BorderMultiTouchMode_MouseUp(object sender, MouseButtonEventArgs e) {
- if (isInMultiTouchMode) {
+ private void BorderMultiTouchMode_MouseUp(object sender, MouseButtonEventArgs e)
+ {
+ if (isInMultiTouchMode)
+ {
inkCanvas.StylusDown -= MainWindow_StylusDown;
inkCanvas.StylusMove -= MainWindow_StylusMove;
inkCanvas.StylusUp -= MainWindow_StylusUp;
@@ -25,8 +29,9 @@ namespace Ink_Canvas {
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
inkCanvas.Children.Clear();
isInMultiTouchMode = false;
- //SymbolIconMultiTouchMode.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.People;
- } else {
+ }
+ else
+ {
inkCanvas.StylusDown += MainWindow_StylusDown;
inkCanvas.StylusMove += MainWindow_StylusMove;
inkCanvas.StylusUp += MainWindow_StylusUp;
@@ -35,78 +40,122 @@ namespace Ink_Canvas {
inkCanvas.EditingMode = InkCanvasEditingMode.None;
inkCanvas.Children.Clear();
isInMultiTouchMode = true;
- //SymbolIconMultiTouchMode.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Contact;
}
}
- private void MainWindow_TouchDown(object sender, TouchEventArgs e) {
+ private void MainWindow_TouchDown(object sender, TouchEventArgs e)
+ {
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
- if (!isHidingSubPanelsWhenInking) {
+ if (!isHidingSubPanelsWhenInking)
+ {
isHidingSubPanelsWhenInking = true;
HideSubPanels(); // 书写时自动隐藏二级菜单
}
- double boundWidth = e.GetTouchPoint(null).Bounds.Width;
- if (boundWidth > 20) {
- inkCanvas.EraserShape = new EllipseStylusShape(boundWidth * 0.75, boundWidth * 0.75);
+ double boundWidth = e.GetTouchPoint(null).Bounds.Width, eraserMultiplier = 1.0;
+ if (!Settings.Advanced.EraserBindTouchMultiplier && Settings.Advanced.IsSpecialScreen)
+ {
+ eraserMultiplier = 1 / Settings.Advanced.TouchMultiplier;
+ }
+
+ if ((Settings.Advanced.TouchMultiplier != 0 || !Settings.Advanced.IsSpecialScreen) //启用特殊屏幕且触摸倍数为 0 时禁用橡皮
+ && (boundWidth > BoundsWidth * 2.5))
+ {
+ if (drawingShapeMode == 0 && forceEraser) return;
+ double k = 1;
+ switch (Settings.Canvas.EraserSize)
+ {
+ case 0:
+ k = 0.5;
+ break;
+ case 1:
+ k = 0.8;
+ break;
+ case 3:
+ k = 1.25;
+ break;
+ case 4:
+ k = 1.8;
+ break;
+ }
+ inkCanvas.EraserShape = new EllipseStylusShape(boundWidth * k * eraserMultiplier * 0.25, boundWidth * k * eraserMultiplier * 0.25);
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.EraseByPoint;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
- } else {
+ }
+ else
+ {
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.None;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
}
}
- private void MainWindow_StylusDown(object sender, StylusDownEventArgs e) {
+ private void MainWindow_StylusDown(object sender, StylusDownEventArgs e)
+ {
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
+
TouchDownPointsList[e.StylusDevice.Id] = InkCanvasEditingMode.None;
}
- private async void MainWindow_StylusUp(object sender, StylusEventArgs e) {
- try {
+ private async void MainWindow_StylusUp(object sender, StylusEventArgs e)
+ {
+ try
+ {
inkCanvas.Strokes.Add(GetStrokeVisual(e.StylusDevice.Id).Stroke);
await Task.Delay(5); // 避免渲染墨迹完成前预览墨迹被删除导致墨迹闪烁
inkCanvas.Children.Remove(GetVisualCanvas(e.StylusDevice.Id));
inkCanvas_StrokeCollected(inkCanvas, new InkCanvasStrokeCollectedEventArgs(GetStrokeVisual(e.StylusDevice.Id).Stroke));
- } catch (Exception ex) {
+ }
+ catch (Exception ex)
+ {
Label.Content = ex.ToString();
}
- try {
+ try
+ {
StrokeVisualList.Remove(e.StylusDevice.Id);
VisualCanvasList.Remove(e.StylusDevice.Id);
TouchDownPointsList.Remove(e.StylusDevice.Id);
- if (StrokeVisualList.Count == 0 || VisualCanvasList.Count == 0 || TouchDownPointsList.Count == 0) {
+ if (StrokeVisualList.Count == 0 || VisualCanvasList.Count == 0 || TouchDownPointsList.Count == 0)
+ {
inkCanvas.Children.Clear();
StrokeVisualList.Clear();
VisualCanvasList.Clear();
TouchDownPointsList.Clear();
}
- } catch { }
+ }
+ catch { }
}
- private void MainWindow_StylusMove(object sender, StylusEventArgs e) {
- try {
+ private void MainWindow_StylusMove(object sender, StylusEventArgs e)
+ {
+ try
+ {
if (GetTouchDownPointsList(e.StylusDevice.Id) != InkCanvasEditingMode.None) return;
- try {
+ try
+ {
if (e.StylusDevice.StylusButtons[1].StylusButtonState == StylusButtonState.Down) return;
- } catch { }
+ }
+ catch { }
var strokeVisual = GetStrokeVisual(e.StylusDevice.Id);
var stylusPointCollection = e.GetStylusPoints(this);
- foreach (var stylusPoint in stylusPointCollection) {
+ foreach (var stylusPoint in stylusPointCollection)
+ {
strokeVisual.Add(new StylusPoint(stylusPoint.X, stylusPoint.Y, stylusPoint.PressureFactor));
}
strokeVisual.Redraw();
- } catch { }
+ }
+ catch { }
}
- private StrokeVisual GetStrokeVisual(int id) {
- if (StrokeVisualList.TryGetValue(id, out var visual)) {
+ private StrokeVisual GetStrokeVisual(int id)
+ {
+ if (StrokeVisualList.TryGetValue(id, out var visual))
+ {
return visual;
}
@@ -120,15 +169,19 @@ namespace Ink_Canvas {
return strokeVisual;
}
- private VisualCanvas GetVisualCanvas(int id) {
- if (VisualCanvasList.TryGetValue(id, out var visualCanvas)) {
+ private VisualCanvas GetVisualCanvas(int id)
+ {
+ if (VisualCanvasList.TryGetValue(id, out var visualCanvas))
+ {
return visualCanvas;
}
return null;
}
- private InkCanvasEditingMode GetTouchDownPointsList(int id) {
- if (TouchDownPointsList.TryGetValue(id, out var inkCanvasEditingMode)) {
+ private InkCanvasEditingMode GetTouchDownPointsList(int id)
+ {
+ if (TouchDownPointsList.TryGetValue(id, out var inkCanvasEditingMode))
+ {
return inkCanvasEditingMode;
}
return inkCanvas.EditingMode;
@@ -148,29 +201,37 @@ namespace Ink_Canvas {
bool isLastTouchEraser = false;
private bool forcePointEraser = true;
- private void Main_Grid_TouchDown(object sender, TouchEventArgs e) {
-
- if (!isHidingSubPanelsWhenInking) {
+ private void Main_Grid_TouchDown(object sender, TouchEventArgs e)
+ {
+ if (!isHidingSubPanelsWhenInking)
+ {
isHidingSubPanelsWhenInking = true;
HideSubPanels(); // 书写时自动隐藏二级菜单
}
- if (NeedUpdateIniP()) {
+ if (NeedUpdateIniP())
+ {
iniP = e.GetTouchPoint(inkCanvas).Position;
}
- if (drawingShapeMode == 9 && isFirstTouchCuboid == false) {
+ if (drawingShapeMode == 9 && isFirstTouchCuboid == false)
+ {
MouseTouchMove(iniP);
}
inkCanvas.Opacity = 1;
- double boundsWidth = GetTouchBoundWidth(e);
- var eraserMultiplier = 1d;
- if (!Settings.Advanced.EraserBindTouchMultiplier && Settings.Advanced.IsSpecialScreen) eraserMultiplier = 1 / Settings.Advanced.TouchMultiplier;
- if (boundsWidth > BoundsWidth) {
+ double boundsWidth = GetTouchBoundWidth(e), eraserMultiplier = 1.0;
+ if (!Settings.Advanced.EraserBindTouchMultiplier && Settings.Advanced.IsSpecialScreen)
+ {
+ eraserMultiplier = 1 / Settings.Advanced.TouchMultiplier;
+ }
+ if (boundsWidth > BoundsWidth)
+ {
isLastTouchEraser = true;
if (drawingShapeMode == 0 && forceEraser) return;
- if (boundsWidth > BoundsWidth * 2.5) {
+ if (boundsWidth > BoundsWidth * 2.5)
+ {
double k = 1;
- switch (Settings.Canvas.EraserSize) {
+ switch (Settings.Canvas.EraserSize)
+ {
case 0:
k = 0.5;
break;
@@ -184,19 +245,26 @@ namespace Ink_Canvas {
k = 1.8;
break;
}
- inkCanvas.EraserShape = new EllipseStylusShape(boundsWidth * 1.5 * k * eraserMultiplier * 0.75, boundsWidth * 1.5 * k * eraserMultiplier * 0.75);
+ inkCanvas.EraserShape = new EllipseStylusShape(boundsWidth * k * eraserMultiplier, boundsWidth * k * eraserMultiplier);
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
- } else {
- if (StackPanelPPTControls.Visibility == Visibility.Visible && inkCanvas.Strokes.Count == 0 && Settings.PowerPointSettings.IsEnableFingerGestureSlideShowControl) {
+ }
+ else
+ {
+ if (StackPanelPPTControls.Visibility == Visibility.Visible && inkCanvas.Strokes.Count == 0 && Settings.PowerPointSettings.IsEnableFingerGestureSlideShowControl)
+ {
isLastTouchEraser = false;
inkCanvas.EditingMode = InkCanvasEditingMode.GestureOnly;
inkCanvas.Opacity = 0.1;
- } else {
+ }
+ else
+ {
inkCanvas.EraserShape = new EllipseStylusShape(5, 5);
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke;
}
}
- } else {
+ }
+ else
+ {
isLastTouchEraser = false;
inkCanvas.EraserShape = forcePointEraser ? new EllipseStylusShape(50, 50) : new EllipseStylusShape(5, 5);
if (forceEraser) return;
@@ -204,7 +272,8 @@ namespace Ink_Canvas {
}
}
- public double GetTouchBoundWidth(TouchEventArgs e) {
+ public double GetTouchBoundWidth(TouchEventArgs e)
+ {
var args = e.GetTouchPoint(null).Bounds;
double value;
if (!Settings.Advanced.IsQuadIR) value = args.Width;
@@ -220,10 +289,12 @@ namespace Ink_Canvas {
InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink;
bool isSingleFingerDragMode = false;
- private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e) {
+ private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e)
+ {
dec.Add(e.TouchDevice.Id);
//设备1个的时候,记录中心点
- if (dec.Count == 1) {
+ if (dec.Count == 1)
+ {
TouchPoint touchPoint = e.GetTouchPoint(inkCanvas);
centerPoint = touchPoint.Position;
@@ -231,45 +302,57 @@ namespace Ink_Canvas {
lastTouchDownStrokeCollection = inkCanvas.Strokes.Clone();
}
//设备两个及两个以上,将画笔功能关闭
- if (dec.Count > 1 || isSingleFingerDragMode || !Settings.Gesture.IsEnableTwoFingerGesture) {
+ if (dec.Count > 1 || isSingleFingerDragMode || !Settings.Gesture.IsEnableTwoFingerGesture)
+ {
if (isInMultiTouchMode || !Settings.Gesture.IsEnableTwoFingerGesture) return;
- if (inkCanvas.EditingMode != InkCanvasEditingMode.None && inkCanvas.EditingMode != InkCanvasEditingMode.Select) {
+ if (inkCanvas.EditingMode != InkCanvasEditingMode.None && inkCanvas.EditingMode != InkCanvasEditingMode.Select)
+ {
lastInkCanvasEditingMode = inkCanvas.EditingMode;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
}
}
}
- private void inkCanvas_PreviewTouchUp(object sender, TouchEventArgs e) {
+ private void inkCanvas_PreviewTouchUp(object sender, TouchEventArgs e)
+ {
//手势完成后切回之前的状态
- if (dec.Count > 1) {
- if (inkCanvas.EditingMode == InkCanvasEditingMode.None) {
+ if (dec.Count > 1)
+ {
+ if (inkCanvas.EditingMode == InkCanvasEditingMode.None)
+ {
inkCanvas.EditingMode = lastInkCanvasEditingMode;
}
}
dec.Remove(e.TouchDevice.Id);
inkCanvas.Opacity = 1;
- if (dec.Count == 0) {
+ if (dec.Count == 0)
+ {
if (lastTouchDownStrokeCollection.Count() != inkCanvas.Strokes.Count() &&
- !(drawingShapeMode == 9 && !isFirstTouchCuboid)) {
+ !(drawingShapeMode == 9 && !isFirstTouchCuboid))
+ {
int whiteboardIndex = CurrentWhiteboardIndex;
- if (currentMode == 0) {
+ if (currentMode == 0)
+ {
whiteboardIndex = 0;
}
strokeCollections[whiteboardIndex] = lastTouchDownStrokeCollection;
}
}
}
- private void inkCanvas_ManipulationStarting(object sender, ManipulationStartingEventArgs e) {
+ private void inkCanvas_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
+ {
e.Mode = ManipulationModes.All;
}
- private void inkCanvas_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e) {
+ private void inkCanvas_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
+ {
}
- private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) {
- if (e.Manipulators.Count() == 0) {
+ private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
+ {
+ if (e.Manipulators.Count() == 0)
+ {
if (forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
@@ -293,9 +376,11 @@ namespace Ink_Canvas {
_currentCommitType = CommitReason.UserInput;
}
- private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
+ private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
+ {
if (isInMultiTouchMode || !Settings.Gesture.IsEnableTwoFingerGesture) return;
- if ((dec.Count >= 2 && (Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode || StackPanelPPTControls.Visibility != Visibility.Visible || StackPanelPPTButtons.Visibility == Visibility.Collapsed)) || isSingleFingerDragMode) {
+ if ((dec.Count >= 2 && (Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode || StackPanelPPTControls.Visibility != Visibility.Visible || StackPanelPPTButtons.Visibility == Visibility.Collapsed)) || isSingleFingerDragMode)
+ {
ManipulationDelta md = e.DeltaManipulation;
Vector trans = md.Translation; // 获得位移矢量
@@ -304,7 +389,8 @@ namespace Ink_Canvas {
if (Settings.Gesture.IsEnableTwoFingerTranslate)
m.Translate(trans.X, trans.Y); // 移动
- if (Settings.Gesture.IsEnableTwoFingerGestureTranslateOrRotation) {
+ if (Settings.Gesture.IsEnableTwoFingerGestureTranslateOrRotation)
+ {
double rotate = md.Rotation; // 获得旋转角度
Vector scale = md.Scale; // 获得缩放倍数
@@ -320,12 +406,16 @@ namespace Ink_Canvas {
}
StrokeCollection strokes = inkCanvas.GetSelectedStrokes();
- if (strokes.Count != 0) {
- foreach (Stroke stroke in strokes) {
+ if (strokes.Count != 0)
+ {
+ foreach (Stroke stroke in strokes)
+ {
stroke.Transform(m, false);
- foreach (Circle circle in circles) {
- if (stroke == circle.Stroke) {
+ foreach (Circle circle in circles)
+ {
+ if (stroke == circle.Stroke)
+ {
circle.R = GetDistance(circle.Stroke.StylusPoints[0].ToPoint(), circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].ToPoint()) / 2;
circle.Centroid = new Point((circle.Stroke.StylusPoints[0].X + circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].X) / 2,
(circle.Stroke.StylusPoints[0].Y + circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].Y) / 2);
@@ -333,29 +423,42 @@ namespace Ink_Canvas {
}
}
- if (Settings.Gesture.IsEnableTwoFingerZoom) {
- try {
+ if (Settings.Gesture.IsEnableTwoFingerZoom)
+ {
+ try
+ {
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
- } catch { }
+ }
+ catch { }
}
}
- } else {
- if (Settings.Gesture.IsEnableTwoFingerZoom) {
- foreach (Stroke stroke in inkCanvas.Strokes) {
+ }
+ else
+ {
+ if (Settings.Gesture.IsEnableTwoFingerZoom)
+ {
+ foreach (Stroke stroke in inkCanvas.Strokes)
+ {
stroke.Transform(m, false);
- try {
+ try
+ {
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
- } catch { }
+ }
+ catch { }
};
- } else {
- foreach (Stroke stroke in inkCanvas.Strokes) {
+ }
+ else
+ {
+ foreach (Stroke stroke in inkCanvas.Strokes)
+ {
stroke.Transform(m, false);
};
}
- foreach (Circle circle in circles) {
+ foreach (Circle circle in circles)
+ {
circle.R = GetDistance(circle.Stroke.StylusPoints[0].ToPoint(), circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].ToPoint()) / 2;
circle.Centroid = new Point(
(circle.Stroke.StylusPoints[0].X + circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].X) / 2,
@@ -366,4 +469,4 @@ namespace Ink_Canvas {
}
}
}
-}
+}
\ No newline at end of file