编辑:
好的,由于某种原因,我虽然您使用的是 WP Toolkit 的 Gesture 侦听器,它会在每种方向模式下报告正确的 X any Y。在您的情况下,您需要检测您所处的方向模式并进行必要的调整。
似乎当方向为横向时,轴被切换。在横向左模式下,X 轴倒置,而在横向右模式下,Y 轴倒置。以下代码应该可以解决您的问题:
bool _switchAxis;
bool _invertX ;
bool _invertY;
private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e) {
_switchAxis = (e.Orientation | PageOrientation.LandscapeLeft | PageOrientation.LandscapeRight) == (PageOrientation.LandscapeLeft | PageOrientation.LandscapeRight);
_invertX = e.Orientation == PageOrientation.LandscapeLeft;
_invertY = e.Orientation == PageOrientation.LandscapeRight;
}
private void Touch_FrameReported(object sender, System.Windows.Input.TouchFrameEventArgs e) {
var width = Application.Current.Host.Content.ActualWidth;
var height = Application.Current.Host.Content.ActualHeight;
var primaryPoint = e.GetPrimaryTouchPoint(null);
if (_switchAxis) {
if (_invertY) imgStar.X = height - primaryPoint.Position.Y; else imgStar.X = primaryPoint.Position.Y;
if (_invertX) imgStar.Y = width - primaryPoint.Position.X; else imgStar.Y = primaryPoint.Position.X;
} else {
imgStar.X = primaryPoint.Position.X;
imgStar.Y = primaryPoint.Position.Y;
}
}
您需要将OrientationChanged
事件添加到页面 xaml:
<phone:PhoneApplicationPage
<!-- ... -->
OrientationChanged="PhoneApplicationPage_OrientationChanged"
/>
在横向模式下,一个可见的应用程序栏和系统托盘将为您搞乱 X。
如果您有应用程序栏,请将其模式设置为最小化
ApplicationBar.Mode = ApplicationBarMode.Minimized
您还需要隐藏系统托盘以避免手动调整 X。在页面加载事件上执行此操作
xml:
<phone:PhoneApplicationPage
<!-- stuff -->
Loaded="PhoneApplicationPage_Loaded"
/>
后面的代码:
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {
SystemTray.IsVisible = false;
}
此外,您还想从 X 中减去 image.Width/2 并从 Y 中减去 image.Height/2 以使其恰好位于指尖的中心。
imgStar.X = PrimaryPoint.Position.X - (img.Width/2);
imgStar.Y = PrimaryPoint.Position.Y - (img.Height/2);
那应该可以解决问题。