2011-11-13 54 views

回答

2

據我所知,在方式沒有內置,所以你會做這樣的事情

•捕獲的開始時間是控制的觸下事件

•與此相比,釋放時間在TouchUup事件

•如果兩個人都是通過X不同,那麼運行長觸摸代碼

有可能是你必須編寫周圍的幾件事情,但是這是基本的想法

+1

您還需要確保觸摸在這段時間內移動的距離不超過1/2英寸,並且有一個動畫向用戶顯示您正在看他們的手指,以便他們意識到他們是應該保持不變 –

0

長按,或按住,因爲我認爲它是正式命名的,可以通過右鍵單擊事件進行檢測。
如果您使用的是Surface窗口,則可能是因爲右鍵單擊事件被禁用。

+0

我們使用Surface SDK組件來啓用項目中的觸摸,並且確實觸發了右鍵單擊事件(以及單擊事件)。它是Surface SDK 2.0測試版,如果這很重要,我們使用常規的WPF窗口。 – AkselK

+0

你使用Surface硬件嗎?一個標準的Windows PC會給你鼠標事件,但真實的表面輸入不會 –

0

在您可以使用的所有Surface控件上都有一個ContactHoldGesture事件。但是,我說這是在微軟期間負責創建此功能的人,此事件設計得很差,不應使用。它並沒有告訴你係統何時決定一個手指移動得太多而不能算作「保留」,並且它不會告訴你繪製動畫所需的信息,告訴用戶正在進行「保留」。你最好做@Kevin提出的建議並構建你自己的實現。

+0

認真? 目前,在一個快速而骯髒的原型中,我仍然使用了ContactHoldGesture。不過,我會記住你的建議。還有一個問題,@Robert:我可以在哪裏找到Surface控件在2.0 SDK中具有的所有事件的參考?我無法找到任何令人滿意的東西,因爲我可以找到關於版本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 –

3

有一個叫TouchAndHoldGesturePreviewTouchHoldGesture

1

事件這是可以做到的是,在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的任務處於WaitingForActivation狀態。 SetResult(false)永遠不會被觸發。最好檢查task.Task.Status!= TaskStatus.RanToCompletion。最好使用TrySetResult而不是SetResult。 – GreenEyedAndy