WPF有触摸和保持手势吗?

Ove*_*ler 2 c# wpf touch gesture

WPF有触摸和保持手势吗?我找不到那个事件,所以我试着为自己实现一个.我知道有Stylus课,但在WPF中它并没有帮助我.如果没有我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace WebControlTouch
{
    /// <summary>
    /// Due to lack of Touch-and-Hold gesture, here is implementation of it. Stupid M$.
    /// </summary>
    public static class Touch_and_Hold
    {
        #region Constructor + methods
        /// <summary>
        /// Static constructor which creates timer object with 1000ms interval, also sets parameters of Timer.
        /// </summary>
        static Touch_and_Hold()
        {
            gestureTimer = new Timer(1000);
            gestureTimer.AutoReset = false;
            gestureTimer.Elapsed += gestureTimer_Elapsed;
        }
        /// <summary>
        /// On elasped (time ofc)
        /// </summary>
        /// <seealso cref="gestureTimer"/>        
        static void gestureTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            occured = true;
        }
        /// <summary>
        /// Call it on OnTouchDown event.
        /// It will start timer and will count time of touch
        /// </summary>
        /// <returns>Returns that gesture occured</returns>
        public static void onTouch()
        {
            gestureTimer.Start();
        }

        /// <summary>
        /// Call it on touch up mainwindow event (or somewhere else)
        /// It stops gesture timer
        /// </summary>
        public static void onTouchUp()
        {
        occured = false;
        }
        #endregion 
        #region Members + properties
        /// <summary>
        /// Timer for measuring touchTime
        /// </summary>
        private static Timer gestureTimer;
        /// <summary>
        /// Do tap-and-hold occured
        /// </summary>
        private static bool occured = false;
        /// <summary>
        /// Property for getting occured flag
        /// </summary>
        public static bool occuredGesture
        {
            get { return occured; }
        }
        #endregion
    }

}
Run Code Online (Sandbox Code Playgroud)

如果是,请告诉我活动的名称.如果不是 - 试着引导我解决问题.任何帮助将非常感激.

Jaw*_*har 5

有可能以一种等待的方式做到这一点.创建具有特定间隔的计时器.用户点击时启动它,并在计时器结束后返回方法.如果用户释放了手,则返回带有false标志的方法.

public static Task<bool> TouchHold(this FrameworkElement element, TimeSpan duration)
{
    DispatcherTimer timer = new DispatcherTimer();
    TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
    timer.Interval = duration;

    MouseButtonEventHandler touchUpHandler = delegate
    {
        timer.Stop();
        if (task.Task.Status == TaskStatus.Running)
        {
            task.SetResult(false);
        }
    };

    element.PreviewMouseUp += touchUpHandler;

    timer.Tick += delegate
    {
        element.PreviewMouseUp -= touchUpHandler;
        timer.Stop();
        task.SetResult(true);
    };

    timer.Start();
    return task.Task;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读此文章.