如何正确启用UWP应用程序的DPI缩放

4
我已经创建了我的第一个UWP应用程序。这是一个Windows 8.1 UWP应用程序,将帮助我在大学安排课程,因为目前的系统非常糟糕。我一直在使用我的Windows 10台式电脑和默认系统缩放(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>

我认为这可能是应用程序清单中的启用缩放选项或其他类似选项,但我找不到任何类似的东西。我预计会出现这样的问题,因为我还没有包含更高分辨率的选项,但我没有预料到这会发生在在xaml中定义的布局元素上。

有人能否解释一下可能发生了什么?这是我第一个完整的应用程序,我有些迷失。


UWP在Win10上的缩放并不像你想象的那样工作。它会注意到物理屏幕尺寸,而不是你的DPI设置。更多信息请看这里 - Hans Passant
不,我想我明白了。我的笔记本电脑显示器需要125%的系统缩放才能使功能大小正确。这样做,例如任务栏与我的桌面上的大小相同。如果它是100%,那么一切都会变小。我的应用程序在100时与其他内容表现相同,但在125时不会像其他所有内容一样变大。我认为我使用了有效像素来创建所有内容,这些内容应该在该设置下按比例缩放25%。 - Graham
1个回答

1

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

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

以下是一种尝试为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 
    };
  }
}

好的。你有什么想法可以解决这个问题吗?我不想把它转换成UWP,因为我的大学里还有很多人在使用8或8.1,他们会被排除在外。 - Graham
添加信息;虽然不支持。你真的应该构建两个应用程序(一个8.1应用程序和一个10应用程序)。 - Peter Torr - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接