Windows Phone 导航按钮与屏幕分辨率重叠

Windows Phone navigation buttons overlap with screen resolution

下面您会在 Windows Phone 8.1 1 2 设备中看到 运行 屏幕。两者都声称具有 800x480 的视口宽度和高度,但是正如您从图像中看到的那样,635 的导航按钮与游戏区域重叠。

我检查了 GraphicsDevice.Adapter 和 GraphicsDevice.Viewport 中的各种属性,但它们都是一样的!

屏幕是 运行 C# UWP Monogame 代码。我将 PrefferedBackBufferWidth 和 Height 设置为 480x800。

如何判断导航按钮是否占据了屏幕的一部分?

我会进一步扩展答案。

在 windows phone 8.1 中,您有两个 ApplicationViewBoundsMode 枚举值。

  • UseVisible,应用程序内部的页面将仅使用可见区域,不包括 StatusBar、应用程序栏和软导航按钮。

要让您的应用使用 ApplicationViewBoundsMode.UseVisible 选项,请在 app.xaml.cs 中的 `Windows.Current.Activate();

之前添加以下内容
#if WINDOWS_PHONE_APP
        ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseVisible);
#endif
  • UseCoreWindow,在核心window占据的区域内布置window的内容(即包括任何被遮挡的区域——包括软导航按钮)。

要让您的应用使用 ApplicationViewBoundsMode.UseCoreWindow 选项,请在 Windows.Current.Activate();

之前的 app.xaml.cs 中添加以下内容
#if WINDOWS_PHONE_APP
        ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseCoreWindow);
#endif

在某些情况下,开发人员可能希望使用 UserCoreWindow 选项在应用栏下显示内容,但作为副作用,导航软按钮会遮挡部分页面以解决此问题,请按照下一个解决方案。

您可以在 WindowsPhone 中监听 ApplicationView.GetForCurrentView().VisibleBoundsChanged 并更新页面边距。

这是 Joost van 写的关于解决此问题的 article(以及您可以开箱即用的行为)

引用上面的问题解释link

If the application view bound mode is set to ApplicationViewBoundsMode.UseCoreWindow in App.Xaml.cs the phone reports the whole screen size – not only the part that is normally taken by the status bar on top and the application bar at the bottom, but also the part that is used by the button bar.

以及他更新页面边距的解决方案中的一个片段

void KeepInViewBehaviorVisibleBoundsChanged(ApplicationView sender, object args)
{
  UpdateBottomMargin();
}

private void UpdateBottomMargin()
{
  if (WindowHeight > 0.01)
  {
    var currentMargins = AssociatedObject.Margin;

    var newMargin = new Thickness(
      currentMargins.Left, currentMargins.Top, currentMargins.Right,
      originalBottomMargin + 
        (WindowHeight - ApplicationView.GetForCurrentView().VisibleBounds.Bottom));
    AssociatedObject.Margin = newMargin;
  }
}

在您的单人游戏中隐藏导航栏 windows phone 8.1 游戏在您的 app.xaml.cs 文件中的 InitializePhoneApplication() 方法下添加以下代码

 RootFrame = new PhoneApplicationFrame();

        //I have set it to RootVisual to hide navigationbar
        RootFrame.FullScreen = true;
        if (RootVisual != RootFrame)
            RootVisual = RootFrame;