【问题标题】:How to properly enable dpi-scaling on uwp app如何在 uwp 应用程序上正确启用 dpi 缩放
【发布时间】:2016-07-06 15:13:16
【问题描述】:

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

这是我的笔记本电脑在不同比例因子下运行时的两个屏幕截图。第一个是 100%,系统上的所有内容都太小了。

请注意,左侧的导航栏正好是 44 像素宽,与设计相同。现在在下一个屏幕截图中,笔记本电脑以 125% 的系统缩放比例运行(我在截取屏幕截图之前注销并重新登录,因此缩放比例应该已经完全更新)。我们应该期望导航栏为 55 像素宽。

在这里您可以看到应用程序中的区域实际上比以前更小了。与我预期的 55 像素相比,这里的导航栏大约是 37 像素宽。我必须如何扩展 UWP 应用程序有什么遗漏的吗?

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

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

    ...

</Grid>

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

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

【问题讨论】:

  • Win10 上的 UWP 缩放不像你想象的那样工作。它关注物理屏幕尺寸,而不是您的 DPI 设置。 More here.
  • 不,我想我明白了。我的笔记本电脑显示器需要 125% 的系统缩放才能使功能尺寸正确。这样做,例如任务栏的物理尺寸与我桌面上的相同。如果它是 100%,那么一切都会变小。我的应用程序在 100 时的行为与其他东西相同,但在 125 时它不会像其他所有东西一样变大。我假设我使用有效像素创建了所有内容,在该设置下应该放大 25%。

标签: xaml windows-10 uwp scaling


【解决方案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 8.1 应用体验。我在 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,他们将被排除在外。
  • 添加信息;虽然不支持。你真的应该构建两个应用程序(一个 8.1 应用程序和一个 10 应用程序)。
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2014-08-13
  • 2021-02-14
相关资源
最近更新 更多