在Windows Phone 8.1中拖延UIElement的拖放
我正在使用ManipulationDelta
事件处理程序在屏幕上的canvas中拖放一个简单的椭圆。 我正在几个地方使用在线发布的标准方法。 以下是我的事件处理程序中的代码:
Ellipse dragableItem = sender as Ellipse; TranslateTransform translateTransform = dragableItem.RenderTransform as TranslateTransform; double newPosX = Canvas.GetLeft(dragableItem) + translateTransform.X + e.Delta.Translation.X; double newPosY = Canvas.GetTop(dragableItem) + translateTransform.Y + e.Delta.Translation.Y; if (!isCanvasBoundary(newPosX, TestCanvas.ActualWidth - dragableItem.ActualWidth, 0)) translateTransform.X += e.Delta.Translation.X; if (!isCanvasBoundary(newPosY, TestCanvas.ActualHeight - dragableItem.ActualHeight, 0)) translateTransform.Y += e.Delta.Translation.Y;
拖放操作工作正常,但是当用户开始拖动到椭圆实际改变其位置之间时,存在大约1秒的令人讨厌的延迟。 我可以通过打印到调试器看到事件处理程序本身几乎立即完成执行,所以我猜它有一些事情可以为屏幕上的所有UIElements做预编程刷新率导致这种延迟?
反正这个问题呢?
前段时间我遇到了同样的问题。 我想延迟是决定手势是拖动还是点击。 没有任何意外阻力,很难触摸屏幕。
要消除此延迟,可以使用PointerMove
和PointerPressed
事件。 这是我的例子。 你有两个椭圆的canvas,可以毫不拖延地拖动。
XAML
如您所见,我正在处理canvas中的PointerPressed
事件和椭圆中的PointerPressed
事件。 重要的是canvas的背景对于处理触摸事件是不透明的。
C#
public sealed partial class MainPage : Page { UIElement draggedItem = null; Point offset; public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; } private void Ellipse_PointerPressed(object sender, PointerRoutedEventArgs e) { draggedItem = sender as UIElement; offset = e.GetCurrentPoint(draggedItem).Position; } private void Canvas_PointerMoved(object sender, PointerRoutedEventArgs e) { if (draggedItem == null) return; Point dragPoint = e.GetCurrentPoint(Board).Position; Canvas.SetLeft(draggedItem, dragPoint.X - offset.X); Canvas.SetTop(draggedItem, dragPoint.Y - offset.Y); } }
我认为代码非常简单易懂。 我使用PointerPressed
来决定拖动哪个对象。 我也在计算一些偏移,因为我们想要相对于用户触摸的点移动对象。