UWP 上的水平滑动手势

Horizontal swipe gesture on UWP

有什么方法可以使用 wptoolkit 获得与 windows phone 8 相同的滑动手势。 因为 wptoolkit nuget 包不适用于 uwp,所以我无法在 UWP 上获得类似的滑动手势 在 windows Phone 8 借助 WPtoolkit nugetget 包 我把这个

<toolkit:GestureService.GestureListener>
         <toolkit:GestureListener Flick="OnSwipe"/>
</toolkit:GestureService.GestureListener>

在文本块上,这样我就可以在 textbox1 上从左向右或从右向左滑动。 和滑动手势帮助我实现这个

private static int i;
private void OnSwipe(object sender, FlickGestureEventArgs e)
    {
        if (e.HorizontalVelocity < 0)
        {
              i++;
              txtBox1.Text = i.ToString();             
        }

        if (e.HorizontalVelocity > 0)
        {
             i--;
             txtBox1.Text = i.ToString();
        }
    }

我在 uwp 上尝试了使用 scrollViewer 的 Manupulation 方法,但它不断增加值直到滚动查看器停止

这是代码

    private static int i;
    private Point initialpoint;
    private void scrollview_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
    {
        initialpoint = e.Position;
    }

    private void scrollview_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        if (e.IsInertial)
        {
            Point currentpoint = e.Position;
            if (currentpoint.X - initialpoint.X >= 2)
            {
                i++;
                txtBox1.Text = i.ToString();
            }

            if (currentpoint.Y - initialpoint.Y >= 2)
            {
                i--;
                txtBox1.Text = i.ToString();
            }
        }
    }

实现相同功能的任何其他方式。

实际上在这种情况下您不需要处理 ManipulationStarted,也不需要 initialPoint 属性。假设您已经将 ScrollViewerManipulationMode 定义为以下

ManipulationMode="TranslateX,TranslateInertia,System"

然后你只需使用e.Cumulative.Translation.X来告诉你总共刷了多长时间

private void scrollview_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
    if (e.IsInertial)
    {
        var swipedDistance = e.Cumulative.Translation.X;

        if (Math.Abs(swipedDistance) <= 2) return;

        if (swipedDistance > 0)
        {
            i++;
        }
        else
        {
            i--;
        }

        txtBox1.Text = i.ToString();
    }
}

更新

既然我更好地理解了你的问题,我认为你应该处理 TextBox 本身的手势操作。如果您想要即时反馈,只需订阅 ManipulationDelta 事件并创建一个标记以仅 运行 每次触摸滑动逻辑一次。

private bool _isSwiped;
private void txtBox1_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    if (e.IsInertial && !_isSwiped)
    {
        var swipedDistance = e.Cumulative.Translation.X;

        if (Math.Abs(swipedDistance) <= 2) return;

        if (swipedDistance > 0)
        {
            i++;
        }
        else
        {
            i--;
        }

        txtBox1.Text = i.ToString();

        _isSwiped = true;
    }
}

private void txtBox1_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
    _isSwiped = false;
}

确保移动所有处理程序并将 ManipulationMode 设置到 TextBox

<TextBox x:Name="txtBox1"
         ManipulationMode="TranslateX,TranslateInertia,System" 
         ManipulationDelta="txtBox1_ManipulationDelta" 
         ManipulationCompleted="txtBox1_ManipulationCompleted" />