【问题标题】:Windows Phone navigation buttons overlap with screen resolutionWindows Phone 导航按钮与屏幕分辨率重叠
【发布时间】:2015-10-11 19:31:19
【问题描述】:

在下面,您将看到一个在 Windows Phone 8.1 一两设备中运行的屏幕。两者都声称视口宽度和高度为 800x480,但是从图片中可以看出,635 的导航按钮与游戏区域重叠。

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

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

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

【问题讨论】:

  • 看起来 635 有一个屏幕后退按钮,而不是像 820 这样的硬件按钮。
  • 是的,这似乎有所不同,但到目前为止,我还没有找到从 api 获取该信息的方法。
  • 可能是 Windows.UI.Core.SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility 没有要检查的 635
  • WindowsPhone8.1 似乎不存在该 API。
  • ApplicationView.GetForCurrentView() 存在,但没有 AppViewBackButtonVisibility。该对象中的所有其他属性在 2 台设备上都是相同的。

标签: c# windows-phone monogame uwp


【解决方案1】:

我会进一步扩展答案。

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

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

要让您的应用使用ApplicationViewBoundsMode.UseVisible 选项,请在 app.xaml.cs 中的 `Windows.Current.Activate(); 之前添加以下内容;

#if WINDOWS_PHONE_APP
        ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseVisible);
#endif
  • UseCoreWindow,在核心窗口占据的区域内布局窗口的内容(即包括任何被遮挡的区域——包括软导航按钮)。

要让您的应用使用ApplicationViewBoundsMode.UseCoreWindow 选项,请在app.xaml.cs 中Windows.Current.Activate(); 之前添加以下内容

#if WINDOWS_PHONE_APP
        ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseCoreWindow);
#endif

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

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

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

引用上述链接中的问题说明

如果应用程序视图绑定模式设置为 App.Xaml.cs 中的 ApplicationViewBoundsMode.UseCoreWindow 手机会报告整个屏幕大小——不仅是通常由顶部状态栏和底部应用程序栏占据的部分, 也是按钮栏使用的部分。

还有一个来自他的解决方案的 sn-p,他更新了页面的边距

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

【讨论】:

  • 我只是无法使用 monogame api 让它与我的通用项目 (windows/windows phone 8.1) 一起工作。在接下来的几个月中,当我在 vs2015 中使用 windows/window phone 10 将代码迁移到不同的游戏 api 时,我将再次查看这个问题。
  • 事实上,我刚刚在 Visual Studio 2013 中的新 Windows Phone 10.0.10586.0 模拟器中尝试了我的代码,看起来还不错。我将假设新设备可以正常工作,而我的旧 635 可能永远不会。
  • 我进一步扩展了答案,您可以尝试使用 ApplicationViewBoundsMode.UseVisible 并告诉我它是否适合您吗?如果不是,您能告诉我您在上述链接中的解决方案遇到了什么问题以帮助您吗?关于 Windows Phone 10.0.10586.0 模拟器,你确定是软按钮吗?您是否从 Emulator WXGA->Tools->Sensors->Software Buttons 中打开它
  • 其实你是对的,我运行了错误的模拟器。当我尝试 WXGA 并启用软件按钮时,它在新的 wp10 模拟器中仍然失败:(
  • ApplicationViewBoundsMode.UseVisible 和 UseCoreWindow 在我的应用程序中没有任何区别,因为它使用单人游戏。但是,查询 VisibleBounds 给出的高度为 586,而不是 RenderSize 的 640 - 所以这肯定会有所帮助。我将不得不更改我的 draw() 以适应这个丢失的空间以及所有基于可用空间的接触点。
【解决方案2】:

要在你的 monogame 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;

【讨论】:

  • 在只有软件按钮的设备(例如诺基亚 635)上怎么样?我没有尝试过您的建议,但我怀疑它不会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2014-12-27
  • 2014-07-31
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多