Touch and Hold gesture can not be identified using any built-in API. Surface SDKs may provide one. But I will show a simple awaitable way to detect this gesture. Using a timer, we can wait for a particular seconds and return the method once the timer elapsed. If user took his hand before timer elapsed, then immediately return the method with a false flag.

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;
}

I made it as an extension method, which is easy to use. The seconds to wait can be configurable. The following code shows, how to use it.

        protected async override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);

bool isHold = await this.TouchHold(TimeSpan.FromSeconds(1));
if (isHold)
{
MessageBox.Show("Touch and Hold detected!!");
}
}

Happy coding!!