fix:issue #358
This commit is contained in:
@@ -202,13 +202,19 @@ namespace Ink_Canvas
|
|||||||
ShowPage(currentPageIndex);
|
ShowPage(currentPageIndex);
|
||||||
|
|
||||||
// 手动实现触摸滑动
|
// 手动实现触摸滑动
|
||||||
|
const double TouchTapMovementThreshold = 15.0;
|
||||||
double leftTouchStartY = 0;
|
double leftTouchStartY = 0;
|
||||||
|
double leftTouchStartX = 0;
|
||||||
double leftScrollStartOffset = 0;
|
double leftScrollStartOffset = 0;
|
||||||
bool leftIsTouching = false;
|
bool leftIsTouching = false;
|
||||||
|
bool leftTouchDidScroll = false;
|
||||||
BlackBoardLeftSidePageListScrollViewer.TouchDown += (s, e) =>
|
BlackBoardLeftSidePageListScrollViewer.TouchDown += (s, e) =>
|
||||||
{
|
{
|
||||||
leftIsTouching = true;
|
leftIsTouching = true;
|
||||||
leftTouchStartY = e.GetTouchPoint(BlackBoardLeftSidePageListScrollViewer).Position.Y;
|
leftTouchDidScroll = false;
|
||||||
|
var pt = e.GetTouchPoint(BlackBoardLeftSidePageListScrollViewer).Position;
|
||||||
|
leftTouchStartX = pt.X;
|
||||||
|
leftTouchStartY = pt.Y;
|
||||||
leftScrollStartOffset = BlackBoardLeftSidePageListScrollViewer.VerticalOffset;
|
leftScrollStartOffset = BlackBoardLeftSidePageListScrollViewer.VerticalOffset;
|
||||||
BlackBoardLeftSidePageListScrollViewer.CaptureTouch(e.TouchDevice);
|
BlackBoardLeftSidePageListScrollViewer.CaptureTouch(e.TouchDevice);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
@@ -217,25 +223,42 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
if (leftIsTouching)
|
if (leftIsTouching)
|
||||||
{
|
{
|
||||||
double currentY = e.GetTouchPoint(BlackBoardLeftSidePageListScrollViewer).Position.Y;
|
var pt = e.GetTouchPoint(BlackBoardLeftSidePageListScrollViewer).Position;
|
||||||
double delta = leftTouchStartY - currentY;
|
double deltaY = leftTouchStartY - pt.Y;
|
||||||
BlackBoardLeftSidePageListScrollViewer.ScrollToVerticalOffset(leftScrollStartOffset + delta);
|
double deltaX = pt.X - leftTouchStartX;
|
||||||
|
if (!leftTouchDidScroll && (Math.Abs(deltaY) > TouchTapMovementThreshold || Math.Abs(deltaX) > TouchTapMovementThreshold))
|
||||||
|
leftTouchDidScroll = true;
|
||||||
|
if (leftTouchDidScroll)
|
||||||
|
BlackBoardLeftSidePageListScrollViewer.ScrollToVerticalOffset(leftScrollStartOffset + deltaY);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
BlackBoardLeftSidePageListScrollViewer.TouchUp += (s, e) =>
|
BlackBoardLeftSidePageListScrollViewer.TouchUp += (s, e) =>
|
||||||
{
|
{
|
||||||
|
if (leftIsTouching && !leftTouchDidScroll)
|
||||||
|
{
|
||||||
|
var pt = e.GetTouchPoint(BlackBoardLeftSidePageListScrollViewer).Position;
|
||||||
|
double dx = pt.X - leftTouchStartX, dy = pt.Y - leftTouchStartY;
|
||||||
|
if (dx * dx + dy * dy <= TouchTapMovementThreshold * TouchTapMovementThreshold)
|
||||||
|
TrySwitchWhiteboardPageByTouchPoint(BlackBoardLeftSidePageListView, BlackBoardLeftSidePageListScrollViewer, pt, true);
|
||||||
|
}
|
||||||
leftIsTouching = false;
|
leftIsTouching = false;
|
||||||
|
leftTouchDidScroll = false;
|
||||||
BlackBoardLeftSidePageListScrollViewer.ReleaseTouchCapture(e.TouchDevice);
|
BlackBoardLeftSidePageListScrollViewer.ReleaseTouchCapture(e.TouchDevice);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
double rightTouchStartY = 0;
|
double rightTouchStartY = 0;
|
||||||
|
double rightTouchStartX = 0;
|
||||||
double rightScrollStartOffset = 0;
|
double rightScrollStartOffset = 0;
|
||||||
bool rightIsTouching = false;
|
bool rightIsTouching = false;
|
||||||
|
bool rightTouchDidScroll = false;
|
||||||
BlackBoardRightSidePageListScrollViewer.TouchDown += (s, e) =>
|
BlackBoardRightSidePageListScrollViewer.TouchDown += (s, e) =>
|
||||||
{
|
{
|
||||||
rightIsTouching = true;
|
rightIsTouching = true;
|
||||||
rightTouchStartY = e.GetTouchPoint(BlackBoardRightSidePageListScrollViewer).Position.Y;
|
rightTouchDidScroll = false;
|
||||||
|
var pt = e.GetTouchPoint(BlackBoardRightSidePageListScrollViewer).Position;
|
||||||
|
rightTouchStartX = pt.X;
|
||||||
|
rightTouchStartY = pt.Y;
|
||||||
rightScrollStartOffset = BlackBoardRightSidePageListScrollViewer.VerticalOffset;
|
rightScrollStartOffset = BlackBoardRightSidePageListScrollViewer.VerticalOffset;
|
||||||
BlackBoardRightSidePageListScrollViewer.CaptureTouch(e.TouchDevice);
|
BlackBoardRightSidePageListScrollViewer.CaptureTouch(e.TouchDevice);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
@@ -244,15 +267,27 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
if (rightIsTouching)
|
if (rightIsTouching)
|
||||||
{
|
{
|
||||||
double currentY = e.GetTouchPoint(BlackBoardRightSidePageListScrollViewer).Position.Y;
|
var pt = e.GetTouchPoint(BlackBoardRightSidePageListScrollViewer).Position;
|
||||||
double delta = rightTouchStartY - currentY;
|
double deltaY = rightTouchStartY - pt.Y;
|
||||||
BlackBoardRightSidePageListScrollViewer.ScrollToVerticalOffset(rightScrollStartOffset + delta);
|
double deltaX = pt.X - rightTouchStartX;
|
||||||
|
if (!rightTouchDidScroll && (Math.Abs(deltaY) > TouchTapMovementThreshold || Math.Abs(deltaX) > TouchTapMovementThreshold))
|
||||||
|
rightTouchDidScroll = true;
|
||||||
|
if (rightTouchDidScroll)
|
||||||
|
BlackBoardRightSidePageListScrollViewer.ScrollToVerticalOffset(rightScrollStartOffset + deltaY);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
BlackBoardRightSidePageListScrollViewer.TouchUp += (s, e) =>
|
BlackBoardRightSidePageListScrollViewer.TouchUp += (s, e) =>
|
||||||
{
|
{
|
||||||
|
if (rightIsTouching && !rightTouchDidScroll)
|
||||||
|
{
|
||||||
|
var pt = e.GetTouchPoint(BlackBoardRightSidePageListScrollViewer).Position;
|
||||||
|
double dx = pt.X - rightTouchStartX, dy = pt.Y - rightTouchStartY;
|
||||||
|
if (dx * dx + dy * dy <= TouchTapMovementThreshold * TouchTapMovementThreshold)
|
||||||
|
TrySwitchWhiteboardPageByTouchPoint(BlackBoardRightSidePageListView, BlackBoardRightSidePageListScrollViewer, pt, false);
|
||||||
|
}
|
||||||
rightIsTouching = false;
|
rightIsTouching = false;
|
||||||
|
rightTouchDidScroll = false;
|
||||||
BlackBoardRightSidePageListScrollViewer.ReleaseTouchCapture(e.TouchDevice);
|
BlackBoardRightSidePageListScrollViewer.ReleaseTouchCapture(e.TouchDevice);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
using Ink_Canvas.Helpers;
|
using Ink_Canvas.Helpers;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Ink;
|
using System.Windows.Ink;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
namespace Ink_Canvas
|
namespace Ink_Canvas
|
||||||
{
|
{
|
||||||
@@ -66,6 +67,58 @@ namespace Ink_Canvas
|
|||||||
BlackBoardRightSidePageListView.SelectedIndex = CurrentWhiteboardIndex - 1;
|
BlackBoardRightSidePageListView.SelectedIndex = CurrentWhiteboardIndex - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void TrySwitchWhiteboardPageByTouchPoint(ListView listView, ScrollViewer scrollViewer, Point pointInScrollViewer, bool isLeftSide)
|
||||||
|
{
|
||||||
|
if (listView == null || scrollViewer == null) return;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var transform = scrollViewer.TransformToVisual(listView);
|
||||||
|
if (transform == null) return;
|
||||||
|
var pointInListView = transform.Transform(pointInScrollViewer);
|
||||||
|
var hit = VisualTreeHelper.HitTest(listView, pointInListView);
|
||||||
|
if (hit?.VisualHit == null) return;
|
||||||
|
var container = FindAncestorOfType<ListViewItem>(hit.VisualHit);
|
||||||
|
if (container == null) return;
|
||||||
|
int index = listView.ItemContainerGenerator.IndexFromContainer(container);
|
||||||
|
if (index < 0 || index >= blackBoardSidePageListViewObservableCollection.Count) return;
|
||||||
|
var item = blackBoardSidePageListViewObservableCollection[index];
|
||||||
|
if (item == null) return;
|
||||||
|
AnimationsHelper.HideWithSlideAndFade(BoardBorderLeftPageListView);
|
||||||
|
AnimationsHelper.HideWithSlideAndFade(BoardBorderRightPageListView);
|
||||||
|
if (index + 1 != CurrentWhiteboardIndex)
|
||||||
|
{
|
||||||
|
if (currentSelectedElement != null)
|
||||||
|
{
|
||||||
|
var previousEditingMode = inkCanvas.EditingMode;
|
||||||
|
UnselectElement(currentSelectedElement);
|
||||||
|
inkCanvas.EditingMode = previousEditingMode;
|
||||||
|
currentSelectedElement = null;
|
||||||
|
}
|
||||||
|
SaveStrokes();
|
||||||
|
ClearStrokes(true);
|
||||||
|
CurrentWhiteboardIndex = index + 1;
|
||||||
|
RestoreStrokes();
|
||||||
|
UpdateIndexInfoDisplay();
|
||||||
|
}
|
||||||
|
BlackBoardLeftSidePageListView.SelectedIndex = index;
|
||||||
|
BlackBoardRightSidePageListView.SelectedIndex = index;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// 忽略命中测试或切换过程中的异常
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static T FindAncestorOfType<T>(DependencyObject current) where T : DependencyObject
|
||||||
|
{
|
||||||
|
while (current != null)
|
||||||
|
{
|
||||||
|
if (current is T found) return found;
|
||||||
|
current = VisualTreeHelper.GetParent(current);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static void ScrollViewToVerticalTop(FrameworkElement element, ScrollViewer scrollViewer)
|
public static void ScrollViewToVerticalTop(FrameworkElement element, ScrollViewer scrollViewer)
|
||||||
{
|
{
|
||||||
if (element == null || scrollViewer == null)
|
if (element == null || scrollViewer == null)
|
||||||
|
|||||||
Reference in New Issue
Block a user