2015-03-24 155 views
0

我正在使用自定義TouchDevice(以下代碼)與UIElements進行交互。這個TouchDevice導致TouchEnter和TouchLeave事件在UIElements上觸發到屏幕座標的右下角,我傳遞給Move(x,y)而不是在這些座標上的UIElement。我該如何解決?自定義TouchDevice觸發不正確位置的觸摸事件

在我的Surface Pro 3平板電腦(觸摸屏,Windows 8.1)上出現此問題,但不在我的桌面(無觸摸屏,Windows 7)上。

我第一次假定原因是GetTouchPoint(IInputElement relativeTo)的錯誤實施。但是,只有在relativeTo設置爲null時調用此方法。

public class CustomTouchDevice : TouchDevice 
    { 
     public Point Position { get; set; } 

     private GazeTouchDevice(int id) : base(id) 
     { 
      SetActiveSource(PresentationSource.FromVisual(Application.Current.MainWindow)); 
     } 

     public void Move(int x, int y) 
     { 
      if(!IsActive) 
      { 
       Activate(); 
       ReportDown(); 
      } 
      Position = new Point(x, y); 
      ReportMove(); 
     } 

     public void Lost() 
     { 
      if(IsActive) 
      { 
       ReportUp(); 
       Deactivate(); 
      } 
     } 

     public override TouchPoint GetTouchPoint(IInputElement relativeTo) 
     { 
      Point point = Position; 
      if(relativeTo != null) 
      { 
       point = this.ActiveSource.RootVisual.TransformToDescendant((Visual)relativeTo).Transform(Position); 
      } 
      Rect rect = new Rect(point, new Size(1, 1)); 
      return new TouchPoint(this, point, rect, TouchAction.Move); 
     } 

     public override TouchPointCollection GetIntermediateTouchPoints(IInputElement relativeTo) 
     { 
      return new TouchPointCollection(); 
     } 
    } 

在此先感謝!

回答

0

更換的GetTouchPoint這第一線解決了這個問題:

Point point = ActiveSource.RootVisual.PointFromScreen(Position); 

顯然,我的應用程序使用的屏幕不同的座標系中的座標上我的平板電腦系統。我懷疑WPF透明地選擇不使用超高分辨率平板電腦屏幕上的全分辨率(2160x1440 px/216 ppi)。