2010-09-27 27 views
1

我正在開發一個WPF自助服務終端,將客戶端部署在啓用了多點觸控的HP TouchSmart Windows 7機器上。我的問題是,對於Windows 7多點觸摸,應用程序無法識別手指的「點按」作爲按鈕按下事件,因此該按鈕按下觸發器以更改顏色永遠不會被觸發。WPF按鈕按下Windows 7多點觸控

通常會顯示觸摸的Windows 7動畫,並且按鈕單擊事件觸發正常。這只是'IsPressed'事件的XAML定義樣式,它不能像手指敲擊那樣工作。如果用手指施加了足夠的壓力,並且/或者您像指紋那樣滾動或按壓,它最終會起作用。是否有一種解決方法可以使「點按」觸發按下/點擊事件?

<Trigger Property="AreAnyTouchesOver" Value="true"> 
    <Trigger.ExitActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOff}" /> 
    </Trigger.ExitActions> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOn}" /> 
    </Trigger.EnterActions> 
</Trigger> 

<Trigger Property="AreAnyTouchesDirectlyOver" Value="true"> 
    <Trigger.ExitActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOff}" /> 
    </Trigger.ExitActions> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOn}" /> 
    </Trigger.EnterActions> 
</Trigger> 
+0

現在我們已經決定放棄眼睛的糖果來推動釋放門,也許我會有時間回來。 – 2010-10-01 20:42:01

回答

5

我不清楚你想做什麼。

你的問題的一些解釋:

在觸摸IsPressed當你保持接觸下來在元件和移動閾值傳遞給創建一個「新聞」時,纔會觸發(這就是爲什麼你看到它,如果你按下手指並稍微滑動)

一旦出現接觸,IsPressed = false。

當你「點擊」一個按鈕,你實質上是在做一個鼠標點擊。這就是事件如期發生的原因。

那麼你究竟想要做什麼?當某個按鈕被「按下」(「IsPressed」)或單擊(點擊)按鈕時,您想要觸發故事板動畫。

這是兩種不同的情況,還要注意,通常桌面隱喻不能很好地轉換爲觸摸環境。您可能想重新考慮如何向用戶提供視覺反饋。

我覺得最簡單的答案就是觸發「TouchDown」,如果我正確理解你的問題。

UPDATE:

這應該爲觸地得分觸發

<Button Content="Touch Down Example" Height="20" Width="20"> 
     <Button.Triggers> 
      <EventTrigger RoutedEvent="Button.TouchDown"> 
       <BeginStoryboard> 
        .... 
       </BeginStoryboard> 
      </EventTrigger> 
     </Button.Triggers> 
    </Button> 

注意工作:我沒有在我面前觸摸屏,所以有可能是錯誤的,但它看起來是正確的。

+0

對不起,我不清楚 - 我很難溝通我想要的。你是對的,我想觸發'TouchDown',我該怎麼做?一些背景:Kiosk客戶端正在標準Gvision Touch屏幕上開發(不支持多點觸摸) - 因此觸摸/按下/點擊工作原理相同。該應用程序正在部署到支持多點觸控的個人電腦,因此我的溝通問題。希望有所幫助。 – 2010-09-28 14:46:13

+0

更新我的答案,包括示例 – 2010-09-28 16:38:53

+0

嘗試了您的解決方案,但我仍然沒有看到我期望的結果。我想知道Windows 7是否將快速輕敲解釋爲意外觸摸。還嘗試了http://connect.microsoft.com/VisualStudio/feedback/details/527886/touchdown-does-not-trigger-until-the-touch-moves – 2010-09-29 21:30:05

2

對於觸摸開發,我建議在您的項目中使用Microsoft® Surface® Toolkit for Windows Touch Beta,並且使用包含的表面控件,因爲它們可以正確處理觸摸事件,並且可以使用大量的用例,例如用戶用2個手指按下按鈕,並一次提起一個。只有最後的「提升」或TouchUp事件纔會觸發Click事件。

所有的表面控件都是Windows控件的子類,所以SurfaceListBox的子類ListBox,SurfaceButton子類Button等等。這樣,所有的樣式和模板仍然可以與這些控件一起工作。

在你的情況,你會想要使用SurfaceButton控件。簡單地引用添加到工具包組件中,並在外部元件(,等),添加到表面命名空間的引用,如

xmlns:s="http://schemas.microsoft.com/surface/2008" 

,然後從該命名空間中添加表面控制,如

<s:SurfaceButton x:Name="button1" Click="OnButtonClick" /> 
+0

完全同意。但是,如果作者看到的問題是由於觸摸屏供應商沒有正確支持Windows 7 Touch API(因爲看起來可能是這樣),那麼Surface Toolkit在這方面幫助不大。無論如何,如果測試版軟件是這個項目的一個選項,那麼肯定會使用Surface Toolkit – 2010-10-01 20:52:39

+0

@Foovanadil - 當你第一次發佈它時錯過了這個評論,抱歉。我明確提到的原因是我目前正在使用HP Touchsmart產品系列中的設備,這也是我的問題的原因。未處理的觸摸事件*應該*被提升爲鼠標事件,但事實上,許多事情可能會吞噬這些事件,恕不另行通知。 – Hugo 2010-10-14 22:27:54

+0

感謝Hugo,當我有機會時,我會嘗試Surface API。現在我們回到了非多點觸控的觸摸屏。 – 2010-10-22 14:54:28

4

只需將Stylus.IsPressAndHoldEnabled附加屬性設置爲False爲按鈕。這將導致按鈕的IsPressed屬性被設置/清除以響應觸摸以及鼠標點擊。

從文檔的UIElement.TouchDown Event

要引起的PreviewTouchDown和接地事件只要用手指觸摸屏幕來進行,設置Stylus.IsPressAndHoldEnabled附加屬性爲false這個元素。

例如,你可以使用一個設置在你的按鈕樣式,以確保該屬性設置爲false:

<Setter Property="Stylus.IsPressAndHoldEnabled" Value="False"/> 

我發現這個問題,而試圖找到一種方法,讓我的按鈕可靠爲鼠標點擊和觸摸事件添加動畫。接受的答案讓我意識到了錯誤的道路:通過touch up/down事件同步故事板。事實證明,使用IsPressed屬性觸發器既簡單又可靠。希望這可以幫助別人避免犯類似的錯誤。

+0

您可以將我鏈接到解釋如何將靜態屬性設置爲僅用於一個特定元素的值的東西嗎?爲什麼它不是全球變化? – 2017-04-14 00:28:50