如何在uwp app

时间:2016-07-06 15:13:16

标签: xaml windows-10 uwp scaling

我创建了我的第一个UWP应用。它是一个Windows 8.1 UWP应用程序,它将帮助我在大学安排当前系统非常糟糕的课程。我一直在使用我的Windows 10桌面计算机和1080p显示器进行处理,默认系统缩放(100%)。我部署了测试版本并将其安装在笔记本电脑上。笔记本电脑也是Windows 10和1080p,但屏幕较小,因此系统缩放设置为125%。我的问题是,不是这个更高的缩放因子使我的应用程序具有更大的功能,它反过来并缩小应用程序中的所有内容。

以下是我的笔记本电脑在不同缩放系数下运行时的两个屏幕截图。第一个是100%,系统上的所有东西都太小了。

App running at 100% scaling.

请注意,左侧导航栏的设计宽度恰好为44像素。现在,在下一个屏幕截图中,笔记本电脑以125%的系统缩放率运行(我在拍摄屏幕截图之前已经注销,因此缩放应该已经完全更新)。我们应该期望导航栏宽55像素。

App running at 125% scaling.

在这里,您可以看到应用中的区域实际上比以前更小。这里的导航栏宽约37像素,而我预期的55。我在如何扩展UWP应用程序时是否遗漏了一些内容?

我现在没有整个xaml代码,因为我在笔记本电脑上,但我知道导航条是网格的一部分,看起来像这样。此网格是运行应用程序的整个网格,导航栏是第一列。

<Grid x:name="gridOverall">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="44"/>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    ...

</Grid>

我认为它可能是app清单中的启用缩放选项或者其他东西,但我找不到类似的东西。我预计这样的问题会出现在我使用的图像中,因为我还没有包含更高分辨率的选项,但我并不期望在xaml中定义的布局元素会发生这种情况。

任何人都可以对可能发生的事情有所了解吗?这是我的第一个完整的应用程序,我有点迷失。

1 个答案:

答案 0 :(得分:1)

Windows 8.1没有125%缩放的概念;它使用100%/ 140%/ 180%。 DisplayInformation.ResolutionScale的值为100.因此它实际缩放了80%(100/125)。 44 * 0.8是~35。

注意:不支持以下内容,因为它依赖于Windows 8.1应用程序中的反射和使用Windows 10的功能。使用风险自负。

在这种方法中,您可以尝试使用Windows 8.1应用程序为Windows 10提供更好的体验。我在Windows 10上对其进行了简要测试,但您也希望在Windows 8.1上进行更全面的测试:

private void FixUpScale()
{
  // Need to add a using for System.Reflection;

  var displayInfo = DisplayInformation.GetForCurrentView();
  var displayType = displayInfo.GetType();
  var rawPixelsProperty = displayType.GetRuntimeProperty("RawPixelsPerViewPixel");

  if (rawPixelsProperty != null)
  {
    var realScale = (double)rawPixelsProperty.GetValue(displayInfo);

    // To get to actual Windows 10 scale, we need to convert from 
    // the de-scaled Win8.1 (100/125) back to 100, then up again to
    // the desired scale factor (125). So we get the ratio between the
    // Win8.1 pixels and real pixels, and then square it. 
    var fixupFactor = Math.Pow((double)displayInfo.ResolutionScale /
      realScale / 100, 2);

    Window.Current.Content.RenderTransform = new ScaleTransform
    {
      ScaleX = fixupFactor, 
      ScaleY = fixupFactor 
    };
  }
}