【问题标题】:Horizontal swipe gesture on UWPUWP 上的水平滑动手势
【发布时间】:2018-01-14 23:34:56
【问题描述】:

是否有任何方法可以使用 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();
            }
        }
    }

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

【问题讨论】:

    标签: c# xaml uwp uwp-xaml swipe-gesture


    【解决方案1】:

    实际上在这种情况下您不需要处理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" />
    

    【讨论】:

    • 但它仍然会不断增加,直到滚动查看器停止,这意味着它会增加两次值。任何其他更好的建议来代替 scrollviewer
    • 在文本块上它工作得有点晚(刷卡后需要等待 1 或 1.5 秒)它不能立即工作
    • 好的 :),哦,我只是尝试滚动查看器和文本块两者的工作方式相似,它不能工作两次,它只能在 0.5 或 1 秒内工作。延迟,因此我偶然刷了多次,但为什么它会延迟
    • Nice :) 现在它的工作完美无延迟。感谢您抽出宝贵的时间回答我的问题
    • 很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多