在WinRT应用中处理向上滑动、向下滑动、向左滑动和向右滑动手势

15

我有以下代码:

public MainPage()
{
    this.InitializeComponent();
    this.ManipulationStarting += MainPage_ManipulationStarting;
    this.ManipulationStarted += MainPage_ManipulationStarted;
    this.ManipulationInertiaStarting += MainPage_ManipulationInertiaStarting;
    this.ManipulationDelta += MainPage_ManipulationDelta;
    this.ManipulationCompleted += MainPage_ManipulationCompleted;
}
void MainPage_ManipulationStarting(object sender, ManipulationStartingRoutedEventArgs e)
{
    Debug.WriteLine("MainPage_ManipulationStarting");
}
void MainPage_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
    Debug.WriteLine("MainPage_ManipulationStarted");
}
void MainPage_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingRoutedEventArgs e)
{
    Debug.WriteLine("MainPage_ManipulationInertiaStarting");
}
void MainPage_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    Debug.WriteLine("MainPage_ManipulationDelta");
}
void MainPage_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
    Debug.WriteLine("MainPage_ManipulationCompleted");
}

但是我不知道如何使用操纵事件。能否有人描述一下如何处理滑动手势向上、向下、向左和向右?


1
我没有使用过WinRT手势,但是快速查看了MSDN,我敢打赌在Delta(或其他)事件期间可以访问参数的各种属性。例如,ManipulationDeltaRoutedEventArgs.Velocities包含了用户输入方向/角度/缩放的一系列数据。我不能确定那是否是你应该查看的"唯一"选项,但或许它会给你一个好的起点。 - Chris Sinclair
3个回答

22

操作事件提供了平移值。Manipulation Delta 会在你的惯性操作完成之前持续触发。在这个事件中,检查移动是否是惯性的(正常的移动不应该被视为滑动),并检测初始位置和当前位置之间的差异。

一旦达到阈值,触发向上/向下/向左/向右的滑动事件。立即停止操作以避免再次触发相同的事件。

以下代码将对您有所帮助:

    private Point initialpoint;

    private void Grid_ManipulationStarted_1(object sender, ManipulationStartedRoutedEventArgs e)
    {
        initialpoint = e.Position;
    }

    private void Grid_ManipulationDelta_1(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        if (e.IsInertial)
        {
            Point currentpoint = e.Position;
            if (currentpoint.X - initialpoint.X >= 500)//500 is the threshold value, where you want to trigger the swipe right event
            {
                System.Diagnostics.Debug.WriteLine("Swipe Right");
                e.Complete();
            }
        }
    }

3
不需要多个事件,只需使用“e.Cumulative.Translation.X”。 - Jerry Nixon
我发现 e.IsInertial 总是返回 false - 有什么想法吗? - simonalexander2005

4

我尝试了XAML爱好者的答案,但对我来说不是那么准确(对我来说IsIntertial总是返回false)。 我实现了不同的东西(我回复了一个相关主题的先前帖子,链接在这里Handling Swipe Guesture in Windows 8 Grid),供任何想尝试不同方法的人使用。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接