自定义TouchDevice触发错误位置的触摸事件

时间:2015-03-24 23:00:05

标签: c# wpf touch

我使用自定义TouchDevice(下面的代码)与UIElements进行交互。这个TouchDevice导致TouchEnter和TouchLeave事件在UIElements上被触发到屏幕坐标的右下角,我传递给Move(x,y)而不是在这些坐标的UIElement上。我该如何解决这个问题?

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

替换GetTouchPoint的第一行解决了问题:

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

显然我的应用程序使用的坐标系与平板电脑上的屏幕坐标系不同。我怀疑WPF透明地选择不在超高清平板电脑屏幕上使用全分辨率(2160x1440像素/ 216像素)。