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 进行了预编程的刷新率导致了这种延迟?
有没有解决这个问题的?
前段时间我遇到了同样的问题。我猜延迟是决定手势是拖动还是点击。如果没有任何意外拖动,很难触摸屏幕。
要消除此延迟,您可以使用 PointerMove
和 PointerPressed
事件。这是我的例子。您有 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
来决定拖动哪个对象。我也在计算一些偏移量,因为我们想相对于用户触摸的点移动对象。
我正在使用 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 进行了预编程的刷新率导致了这种延迟?
有没有解决这个问题的?
前段时间我遇到了同样的问题。我猜延迟是决定手势是拖动还是点击。如果没有任何意外拖动,很难触摸屏幕。
要消除此延迟,您可以使用 PointerMove
和 PointerPressed
事件。这是我的例子。您有 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
来决定拖动哪个对象。我也在计算一些偏移量,因为我们想相对于用户触摸的点移动对象。