分辨率独立性在 WPF 中的工作原理

本文关键字:工作 独立性 WPF 分辨率 | 更新日期: 2023-09-27 18:30:42

这更多的是出于好奇。我正在研究 WPF 应用程序与分辨率无关。这是否意味着我们不需要为显示器分辨率大小而烦恼?因为作为Windows应用程序开发人员,我面临着使应用程序与不同分辨率兼容的几个挑战。

我的问题是 WPF 如何管理独立于分辨率的属性?我们是否需要提供控件显示的比率?如果用作背景,图像的质量将如何受到影响(它会在高分辨率下失真还是保持其清晰度)?

请帮忙。这可能是项目的决定性因素。

分辨率独立性在 WPF 中的工作原理

据我所知,WPF 使用矢量图形作为按钮,而不是像旧的 WinForms 那样的位图。因此,对于 WPF 来说,调整大小和适应不同的屏幕分辨率很容易。我对背景图像等没有直接经验,但如果它们是基于像素的,我会以比 96 DPI 所需的更高的分辨率提供它们,也许是两倍高?这应该保证,它们在更高的分辨率下看起来不会很差。

作为实际说明:WPF 应用程序始终是可读的,并且在我迄今为止尝试过的所有显示器上看起来都不错。但是,如果您使用小得多的分辨率来显示为较大分辨率开发的程序,则可能会遇到固定对象的问题。例如,将文本框定义为某个最小大小,这比占用太多的可用屏幕。因此,在交付产品之前,我最好定义尽可能少的约束并在其他显示器上测试应用程序,因为它始终可读,但您可能会发现一些可用性问题。

WPF 和分辨率独立性的关键在于它使用与设备无关的单位,并使用它来与系统 dpi 设置("大字体"等)正常工作;因此,例如,如果您正在处理设置为默认 96 dpi 的系统,并绘制一个 96 个单位宽的文本框,WPF 知道这是一个逻辑英寸。如果随后将分辨率更改为 144 dpi,WPF 将使用 144 个物理像素绘制文本框。所有 GUI 元素都像这样完美地扩展。如果您使用 Winforms GUI 尝试同样的事情,您会发现它无法正确缩放 - 您最终会在小文本框等中使用大字体

伊塔另一种说法是澄清你所说的分辨率是什么意思 - 我想 1024 x 768 实际上是"以像素为单位的屏幕尺寸",而 96dpi 更准确地说是实际分辨率,WPF 正确处理了它的变化,而其他平台没有;Winforms等和WPF都将正确显示,如果您只是从800 x 600更改为1024 x 768。

WPF 是基于矢量的,包含许多强大的布局功能,以确保缩放在任何设备上都能很好地工作(简单但功能强大的Grid控件是我的最爱之一)。它基本上使用测量和排列系统,确保子控件知道他们必须使用多少空间,因此可以相应地调整自己的大小

话虽如此,UI 设计人员有责任确保应用程序布局是可扩展的,因为仍然可以通过设置显式大小等来创建硬编码的固定、非流体布局

如果确实发生这种情况,则可以缩放整个 UI(通过使用转换和其他方法),这将具有放大/缩小的效果,具体取决于应用的目标是更大还是更小的分辨率。这样做的缺点是,如果任何非矢量内容(如位图)不是为此缩放而设计的,则它们看起来是块状或扭曲

总之,可以说,WPF 并不直接管理任何分辨率独立性,但通过使用一些简单的布局概念,可以使分辨率独立于 UI,而无需诉诸缩放(类似于在 WinForms 中使用定位...但好多了)

一个小例子:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100">
        <ColumnDefinition Width="auto">
        <ColumnDefinition Width="*">
        <ColumnDefinition Width="2*">
    </Grid.ColumnDefinitions>
</Grid> 

这将创建一个两列网格布局,其中第一列是 100 个单位的固定宽度,第二列仅占用足够的空间来容纳其子控件,第四列按比例占用第三列空间的两倍。这些列将拉伸以完全填充其父容器,无论是屏幕的一小部分区域还是整个窗口。

这通过测量有多少可用空间来工作,使第一列成为固定的 100 个单位,使第二列成为其中子控件的大小,然后计算出剩余的空间并根据它们的比率将其划分到其他列之间。(星号*前面的数字是每个动态大小的列应占用的空间比例。 *本身相当于1*

这与标准的Margin和对齐属性相结合,几乎可以实现任何可以想象的布局......这只是一个控件!

编辑:

我可能会补充一点,虽然大多数人不使用愚蠢的分辨率,但令人惊讶的是,有多少人仍在运行 1024x768 或运行垂直分辨率低于 800 像素的宽屏中分辨率显示器,所以唯一确定的方法就是测试!

问题 1:我的问题是如何 WPF 管理与解析无关的属性?

来自 MSDN:
与分辨率无关且与设备无关的图形。WPF 图形系统中的基本度量单位是与设备无关的像素,无论实际屏幕分辨率如何,该像素都是 1/96 英寸,并为与分辨率无关和与设备无关的呈现提供了基础。每个与设备无关的像素都会自动缩放,以匹配其渲染系统的每英寸点数 (dpi) 设置。

问题2:如果用作背景,图像的质量将如何受到影响(它会在高分辨率下失真还是保持其清晰度)?

我想这主要取决于给定图片的质量。 高质量的图像在缩放时不会失去清晰度。

我建议阅读以下文章:

WPF 简介 您将了解到 wpf 在依赖项(数据绑定、布局、样式、模板、2D、3D、动画等)中不仅仅是分辨率

映像概述 WPF 图形呈现概述