2011-11-13 2 views

답변

2

지금까지 당신이

• 릴리스이 비교 •이

처럼 뭔가를해야 컨트롤의 터치 다운 이벤트 시작 시간을 캡처 할 수 있도록 내가 더는 방법으로 내장이없는 알고 두 사람은 다음 긴 터치 코드 실행 X에 의해 다른 경우 TouchUup 이벤트

• 시간

이 당신이 주변에 코드를해야 할 몇 가지 일 수 있지만 그 기본적인 아이디어

입니다 수
+1

이 시간 동안 터치가 ~ 1/2 인치 이상 움직이지 않았는지 확인하고 사용자가 손가락을보고 있다는 것을 보여주는 애니메이션을 사용하여 자신이 실제로 여전히 고정되어 있어야합니다 –

0

정식으로 이름이 붙은 것처럼 오래 터치하거나 길게 누르는 것은 오른쪽 클릭 이벤트를 통해 감지 할 수 있습니다.
표면 창을 사용하는 경우 오른쪽 클릭 이벤트가 비활성화되어있을 수 있습니다.

+0

우리는 Surface SDK 구성 요소를 사용하여 프로젝트에서 터치를 활성화하고 마우스 오른쪽 버튼 이벤트 (클릭 이벤트는 물론)가 실제로 트리거되었습니다. 중요한 점은 Surface SDK 2.0 베타입니다. 우리는 일반적인 WPF 창을 사용했습니다. – AkselK

+0

표면 하드웨어를 사용하셨습니까? 표준 Windows PC는 마우스 이벤트를 제공하지만 실제 Surface 입력은 –

0

사용할 수있는 모든 표면 컨트롤에 ContactHoldGesture 이벤트가 있습니다. 그러나 필자는 Microsoft에서이 기능을 만드는 책임자로이 문제를 말하고 있습니다.이 이벤트는 잘못 설계되어 사용되어서는 안됩니다. 시스템이 손가락이 "보류"로 간주하기가 너무 많아서 "보류"가 진행 중임을 사용자에게 알리는 애니메이션을 그리는 데 필요한 정보를 제공하지 않는다고 시스템이 결정한 것을 알려주지 않습니다. @Kevin이 제안한 것을 수행하고 자신 만의 구현을 구현하는 것이 훨씬 낫다.

+0

심각하지 않습니까? 빠른 시일 내에, 나는 여전히 ContactHoldGesture에 의지했습니다. 그러나 나는 당신이 제안한 것을 명심 할 것이다. 한 가지 더 질문, @ 로버트 : 2.0 SDK에서 Surface 컨트롤의 모든 이벤트에 대한 참조는 어디에서 찾을 수 있습니까? 버전 1.0과 관련된 대부분의 문서에서 볼 수있는 것처럼 아직 만족스러운 것을 찾을 수 없었습니다. – Tilvia

+0

@Tilvia - Surface 2는 주로 WPF 4가 터치를 위해 구축 한 이벤트를 활용합니다. http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.aspx로 이동하여 해당 페이지에서 단어 "touch"를 검색하십시오. http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.input.touchextensions_members.aspx –

1

TouchAndHoldGesturePreviewTouchHoldGesture라는 이벤트가 그것이 awaitable 방식으로 그렇게 할 수 있습니다. 특정 간격으로 타이머를 만듭니다. 사용자가 두드리고 타이머가 경과 할 때 메소드를 리턴 할 때 시작하십시오. 사용자가 손을 뗀 경우 거짓 플래그가있는 메서드를 반환합니다.

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

자세한 내용은 post을 읽어보십시오.

+0

이것은 좋은 해결책입니다. (이 진절머리 나는 '제스처'와 같은) 하지만 긴 표면 터치 = 오른쪽 클릭 이벤트와 공존합니다. – aggietech

+1

그러나 예상대로 작동하지 않습니다! TaskCompletionSource의 Task는 WaitingForActivation 상태입니다. SetResult (false)는 실행되지 않습니다. task.Task.Status! = TaskStatus.RanToCompletion을 확인하는 것이 좋습니다.그리고 TrySetResult를 SetResult보다 잘 사용하십시오. – GreenEyedAndy