从HD到4K自动缩放/缩放UWP应用程序

时间:2018-04-16 09:53:23

标签: uwp zoom scaling uwp-xaml screen-resolution

有没有办法在4K屏幕上复制应用程序的高清版面(使它们看起来完全一样),而无需手动计算4K屏幕的所有字体大小,边距,填充等,而不是必须在VisualState触发器中设置它们吗?

以下是我当前解决方案的一个示例:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup>
        <VisualState x:Name="ScreenWidthHDState">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="{StaticResource ScreenWidthHD}" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="SampleTextBlock.FontSize" Value="{StaticResource RegularFontSize}" />
                <Setter Target="SampleGrid.Margin" Value="6" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
    <VisualStateGroup>
        <VisualState x:Name="ScreenWidth4KState">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="{StaticResource ScreenWidth4K}"/>
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="SampleTextBlock.FontSize" Value="{StaticResource RegularFontSize4K}" />
                <!-- I'm multiplying the original value (6) by 1.33333 to achieve the exact same layout in 4K that I have in HD -->
                <!-- 4K resolution in effective pixels is 2560 wide (2560/1920 = 1.3333333...) -->
                <Setter Target="SampleGrid.Margin" Value="8" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

这样可行,但问题是我们这里所拥有的并不是真正的响应/自适应设计实现,只是在4K中显示的高清版面的缩放/缩放复制,所以你不会注意到两者之间的差异。通过将“显示设置”中的Windows自定义缩放更改为分辨率为3840x2160的200%,可以实现相同的效果,但这需要相应地配置每台客户端计算机,这不是一种选择。

可以想象,手动计算应用程序中每个元素的尺寸,使其在HD和4K中看起来完全相同,这是一个单调乏味,耗时且不可扩展的解决方案。我试图以几种不同的方式使用ViewBox,但结果远非理想,因为我无法控制在以不同方式调整应用程序窗口大小后布局的实际外观。简单地使用带有ScaleX / ScaleY值的CompositeTransform会使应用​​超出界限并强制滚动条,这也是不可接受的。

任何用于检测屏幕分辨率和神奇缩放/缩放应用程序以使其在高清和4K中看起来完全相同的解决方案?

1 个答案:

答案 0 :(得分:0)

当UWP应用在Xbox One上运行时,只能关闭缩放

bool result = 
   Windows.UI.ViewManagement.ApplicationViewScaling.TrySetDisableLayoutScaling(true);

但我不认为有任何类似的语法可以在桌面上强制扩展。

扩展内置于操作系统本身以及应用程序自动考虑用户为系统设置的扩展的事实通常是优势而非劣势。

不同地说 - 如果应用程序在4K显示器上设置为100%的小字体等,那么问题将不仅存在于您的应用程序中,而是存在于该设备上的所有应用程序中,在这种情况下,用户要么是有意识地选择这种显示设置,或者她应该考虑在系统范围内更改它们,而不是针对特定的应用程序。