2012-02-23 71 views
1

我試圖消除WPF中的TouchDevices,因此我可以忽略非手指觸摸,因爲斑點似乎觸發了我不想要的事件。
起初我有一些簡單的像這樣在WPF中拋出觸摸

private void SurfaceWindow1_PreviewTouchDown(object sender, TouchEventArgs e) 
    { 
     if (!e.TouchDevice.GetIsFingerRecognized() && InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported == true) 
     { 
      e.Handled = true; 
     } 

    } 

效果很好停止與喜歡的東西里面ScatterViewItems和操作觸摸交互。但是在PreviewTouchDown之前必須有其他事情發生,因爲我可以使用blob來激活SVI並將其帶到頂端,儘管不會發生其他操作。我猜想,SVI上的TouchEnter仍然顯示出來,並將其推向前進,但在所有元素上處理TouchEnter給了我相同的東西,所以還有其他事情正在進行。

我看着Touch.FrameReported但SVIS聽到它

private void myTouchFrameHandler(object sender, TouchFrameEventArgs e) 
    { 
     foreach (TouchPoint _tp in e.GetTouchPoints(this)) { 
      if (!_tp.TouchDevice.GetIsFingerRecognized()) 
      { 
       this.ReleaseAllTouchCaptures();  
      } 
     } 
    } 

任何想法之前,我不能釋放的是正確TouchCaptures?
謝謝

回答

2

我偶然發現了同樣的問題,併爲ScatterViewItems實現了一個attached behavior。此行爲會禁用自動IsTopmostOnActivation行爲並偵聽PreviewTouchDown事件,以根據測試條件決定是否將項目置頂。它具有一個易於使用的激活方法

CustomTopmostBehavior.Activate(); 

它增加了一個應用廣泛的風格讓所有ScatterViewItems行爲。

CustomTopmostBehavior.TestCondition = (t) => 
{ 
    return t.GetIsFingerRecognized(); 
}; 
+0

哇這種解決方案的方式更穩健:

行爲可以通過設置其屬性TestCondition這是默認定製!這些附加的屬性非常酷,我不得不看看,我不知道有一個相對ZIndex堆棧。這使SUR40成爲一個堅實的觸摸屏。太感謝了! – aleatoric 2012-03-26 14:06:22

+0

是的,我很想欣賞附加的屬性和行爲:)。他們爲優秀和靈活的解決方案。 – Dominik 2012-04-03 11:02:52

0

好吧,我已經深入瞭解觸摸層次結構。 首先TouchEnter發生在所有TouchDowns發生之前,但沒有隧道事件。 TouchFrameHandler發生在所有的事件完成後,所以拋出。

然後我意識到在UIElements上釋放捕獲對我的問題沒有什麼影響,因爲Touch已經被捕獲了。所以我需要在每個元素上消除TouchEnter中的TouchDevice。 TouchDevice中有一個Deactivate方法,但它受保護。如果我能弄清楚如何去激活一個TouchDevice,我認爲這應該可以做到。這聽起來合理嗎?如果是這樣,我必須弄清楚如何重寫一個受保護的方法。

1

好的,這裏是我的骯髒的解決方法,以阻止觸摸從前進時,他們不被識別爲手指,並阻止SVIs上升到頂部時,在盤旋。

this.PreviewTouchDown += new EventHandler<System.Windows.Input.TouchEventArgs>(SurfaceWindow1_PreviewTouchDown);  
    SVI.TouchEnter += new EventHandler<TouchEventArgs>(SVI_TouchEnter); 
    SVI.TouchLeave +=new EventHandler<TouchEventArgs>(SVI_TouchLeave); 

    void SurfaceWindow1_PreviewTouchDown(object sender, System.Windows.Input.TouchEventArgs e) 
    { 

     if (!e.TouchDevice.GetIsFingerRecognized() && Microsoft.Surface.Presentation.Input.InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported) { e.Handled = true; } 
     else 
     { 
      //normal stuff 
     } 



    } 
    private void SVI_TouchEnter(object sender, TouchEventArgs e) 
    { 
     ScatterViewItem svi = sender as ScatterViewItem; 

     if (!e.TouchDevice.GetIsFingerRecognized() && Microsoft.Surface.Presentation.Input.InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported == true) 
     { 
      svi.IsTopmostOnActivation = false; 
      e.Handled = true; 
     } 
     else 
     { 
      foreach(ScatterViewItem svi in mainScatterView.Items.SourceCollection){ 
       svi.IsTopmostOnActivation = false; 
      } 

      SVI.IsTopmostOnActivation = true; 
     } 

    } 
    private void SVI_TouchLeave(object sender, TouchEventArgs e) 
    { 
      ScatterViewItem svi = sender as ScatterViewItem; 
      svi.IsTopmostOnActivation = true; 
    } 

我感到毛病只是想出了一個這樣一個不清晰的方法。但是因爲沒有隧道TouchEnter,所以你必須檢查所有得到TouchEnter的視覺樹對象,這會更糟。另外我只是無法弄清楚如何使用受保護的方法TouchDevice.Deactivate()。但是,由於SVI捕獲觸摸設備並獲得重新安裝,我發現保留它們的唯一方法是使用TopmostOnActivation屬性,然後捕獲窗口上的PreviewTouchDown並丟棄非手指。

有一個更好的方法來進入觸摸層次結構,對吧?