在 Win 8.1 上更改方向后,MonoGame 中的触摸屏会重置

TouchPanel in MonoGame reset after orientation change on Win 8.1

我正在使用 C#/Monogame (VS 2013) 创建通用(Win 8.1 + Win Phone 8.1)应用程序。我正在使用 MonoGame v3.4。

在我的 game1.cs 初始化代码中,我设置:

TouchPanel.DisplayWidth = _drawState.ScreenBounds.Width;
TouchPanel.DisplayHeight = _drawState.ScreenBounds.Height;

因此触摸输入与我的游戏屏幕尺寸一致(_drawState.ScreenBounds 是一个包含我的虚拟屏幕尺寸的矩形)。

我的游戏设置为仅支持纵向方向:我在 Package.appxmanifest 文件中为两个目标(Win 和 WinPhone)只选择了纵向和纵向翻转方向,并且我已在 game1.cs Init 方法中设置:

graphics.SupportedOrientations = DisplayOrientation.Portrait |
DisplayOrientation.PortraitDown

在 Win 8.1 模拟器和真实的 Win 8.1 平板电脑上测试游戏,我发现方向改变后(顺便说一句,模拟器会旋转和裁剪游戏区域,而真实设备,正如预期的那样,保持纵向方面),TouchPanel 的尺寸错误 - 它重置为实际屏幕尺寸,所以我的所有触摸都关闭了。

这只发生在 Win8.1 目标上 - Win Phone 目标按预期工作。

有什么想法吗?

编辑: 因为我找不到发生了什么,所以我决定订阅尺寸改变事件并设置 TouchPanel.DisplayWidthTouchPanel.DisplayHeight 变量:

this.Window.AllowUserResizing = true;
this.Window.ClientSizeChanged += Window_ClientSizeChanged;

模拟器上调用了Window_ClientSizeChanged方法,真机上没有调用。

我试过:

_window = Windows.UI.Core.CoreWindow.GetForCurrentThread();
_window.SizeChanged += _window_SizeChanged;

同样的事情 - 在模拟器上调用,而不是在设备上调用。

找不到解决这个问题的方法,我只是决定以不同的方式处理触摸输入;我决定使用一个简单的函数将触摸(和鼠标)位置转换为虚拟屏幕坐标,而不是设置 TouchPanel.DisplayWidth 和高度:

ScreenYScale = GraphicsDevice.PresentationParameters.BackBufferHeight / 1920.0f;

public Vector2 TranslateCoords(Vector2 coords)
{
    return new Vector2(coords.X / ScreenYScale, coords.Y / ScreenYScale);
}