簡體   English   中英

Windows Phone 8.1中UIElement的拖放延遲

[英]Delay in drag/drop of UIElement in Windows Phone 8.1

我正在使用ManipulationDelta事件處理程序在屏幕上的畫布中拖放一個簡單的橢圓。 我使用的是在多個地方在線發布的標准方法。 以下是我的事件處理程序中的代碼:

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事件。 這是我的例子。 您有帶有兩個橢圓的畫布,可以將其拖動而沒有任何延遲。

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>

正如你所看到的,我處理PointerMoved在畫布和事件PointerPressed在橢圓事件。 畫布的背景對於處理觸摸事件而言不是透明的,這一點很重要。

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來決定拖動哪個對象。 我也在計算一些偏移量,因為我們想相對於用戶觸摸的點移動對象。

截圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM