2012-02-23 2 views
1

표면에 WPF에서 TouchDevices를 제거하려고합니다. 원하지 않는 이벤트를 방울이 발생시키는 것처럼 손가락이 아닌 부분을 무시할 수 있습니다.
은 첫째 나는 내 ScatterViewItems 및 조작 같은 것들과 터치 상호 작용을 중지 잘 작동이WPF에서 건 드리면

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

    } 

같은 간단한 일을했다. 그러나 Blob을 사용하여 SVI를 활성화하고 다른 조작이 발생하지는 않지만 맨 위로 가져올 수 있기 때문에 PreviewTouchDown 이전에 다른 것이 있어야합니다. 나는 SVI의 TouchEnter가 여전히 나타나서 앞으로 나아 오겠지 만 모든 요소에서 TouchEnter를 처리하면 나에게도 똑같은 결과가 주어져서 계속 진행되고 있습니다.

나는 Touch.FrameReported로 보았다하지만 개의 SVI가

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(); 

모든 ScatterViewItem에 대한 동작을 활성화하는 응용 프로그램 스타일을 추가합니다.

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

와우이 솔루션이 방법이 더 강력 :

동작은 기본적으로 인의 TestCondition 속성을 설정하여 사용자 정의 할 수 있습니다!이 속성들은 아주 멋지다. 나는 이것에 대해 조사 할 것이고, Relative ZIndex 스택이 있는지 몰랐다. 따라서 SUR40은 견고한 터치 스크린이됩니다. 대단히 감사합니다! – aleatoric

+0

예, 저는 속성과 동작을 이해해야합니다. :) 그들은 멋지고 유연한 솔루션을 만듭니다. – Dominik

0

좋아, 터치 계층 구조에 대해 자세히 살펴 보았습니다. 우선 TouchEnter는 모든 TouchDowns이 발생하기 전에 발생하지만 터널링 이벤트가 없습니다. TouchFrameHandler는 모든 이벤트가 완료된 후에 발생하므로이를 버립니다.

그렇다면 Touch가 이미 캡처되어 있기 때문에 UIElements에서 Releasing Captures가 실제로 내 문제에 영향을 미치지 않는다는 것을 깨달았습니다. 그래서 모든 요소에서 TouchEnter의 TouchDevice를 제거해야합니다. TouchDevice에는 Deactivate 메소드가 있지만 보호되어 있습니다. TouchDevice를 비활성화하는 방법을 알아낼 수 있다면 트릭을해야한다고 생각합니다. 그게 합리적이라고 생각하니? 그렇다면 보호 된 메서드를 재정의하는 방법을 찾아야합니다.

1

좋아, 손가락으로 인식되지 않을 때 터치가 전진하는 것을 막고, 위에 올려 놓았을 때 SVI가 위로 올라가지 않게하는 더러운 해결 방법이 있습니다.

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가 touchDevice를 캡쳐하고 어쨌든 재 저장하면 TopmostOnActivation 속성을 가진 상태로 유지 한 다음 Window의 PreviewTouchDown을 잡아 비 손가락을 버립니다.

터치 계층 구조에 들어가기위한 더 좋은 방법이 있어야합니다. 맞습니까?

관련 문제