Windows Phone 8.1 中 UIElement 的 drag/drop 延迟

Delay in drag/drop of UIElement in Windows Phone 8.1

我正在使用 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 秒的令人讨厌的延迟。我可以通过打印到调试器看到事件处理程序本身几乎立即完成执行,所以我猜它对屏幕上的所有 UIElement 进行了预编程的刷新率导致了这种延迟?

有没有解决这个问题的?

前段时间我遇到了同样的问题。我猜延迟是决定手势是拖动还是点击。如果没有任何意外拖动,很难触摸屏幕。

要消除此延迟,您可以使用 PointerMovePointerPressed 事件。这是我的例子。您有 canvas 和两个可以毫不拖延地拖动的椭圆。

XAML

<Grid>
    <Canvas x:Name="Board" PointerMoved="Canvas_PointerMoved" Background="Black">
        <Ellipse Width="64" Height="64" Fill="Red"
                 Canvas.Left="32" Canvas.Top="128" PointerPressed="Ellipse_PointerPressed"/>
        <Ellipse Width="96" Height=" 96" Fill="Blue"
                 Canvas.Left="128" Canvas.Top="16" PointerPressed="Ellipse_PointerPressed"/>
    </Canvas>
</Grid>

如您所见,我在 canvas 中处理 PointerMoved 事件,在省略号中处理 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 来决定拖动哪个对象。我也在计算一些偏移量,因为我们想相对于用户触摸的点移动对象。