c# - UWP 上的水平滑动手势

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

有没有办法使用 wptoolkit 获得与 Windows Phone 8 相同的滑动手势。 因为 wptoolkit nuget 包不适用于 uwp,所以我无法在 UWP 上获得类似的滑动手势 在 Windows Phone 8 中借助 WPtoolkit nugetget 包 我放置了这个

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

在文本 block 上,这样我就可以在 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" />

关于c# - UWP 上的水平滑动手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45550684/

相关文章:

c# - 如何在 C# windows 窗体中使用有空格的字体来创建 Excel 工作表?

c# - 将数据绑定(bind)到 WPF 用户控件

c# - 带有加载动画的 WPF 图像

c# - 在 UWP 中完全关闭辅助 View

c# - 为什么合成动画(UWP 文档中的示例)不起作用?

c# - System.Text.Json 中的动态类型处理/"object"属性的自定义反序列化

c# - .NET 5 vNext 使用参数解决依赖关系

C# 调用 native C++ 所有函数 : what types to use?

c# - INotifyPropertyChanged 不适用于传统绑定(bind),但适用于编译绑定(bind)

xaml - UWP 社区工具包 AdaptiveGridView 控件仅包含一项