我必须在我的源代码中处理 HiDPI 功能,还是由 .Net 提供。 Windows?
Do I have to handle HiDPI capabilities within my source code, or is it provided by .Net resp. Windows?
我正在使用 C# 和 .Net 4.5 开发软件。我在一台 dpi 缩放比例为 100% 的旧机器上开始了这个项目。在我的新机器上,由于高分辨率显示,我必须设置 200% 的缩放比例。
在 Visual Studio 设计器中,软件的 Gui 完美呈现:
Gui within the Designer.
编译软件的Gui渲染不好:Gui in compiled software.
我的期望是,因为我只使用 .Net Gui Elements/Controls 而没有自行设计的 gui 元素,windows 应该可以毫无问题地处理缩放。但正如我所见,windows 没有。
我必须在 Visual Studio 的项目设置中启用 HiDPI 选项,还是必须在我的代码中处理 HiDPI?
默认情况下,大多数 Windows 表单应用程序不支持 DPI。事实上,大多数 Windows 应用程序不支持 DPI。因此,您需要在应用程序清单中选择加入 DPI 感知:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
由于 DPI 感知是每个进程的,因此 VS 设计者在这个问题上别无选择 - 它在 Visual Studio 内运行,这是 DPI 感知。
不过,请确保在低 DPI 和高 DPI 下一切正常。 DPI 感知意味着 "I'm going to handle all DPI scaling correctly, no need to fake it for me; thanks." 希望您设计的表单具有适当的自动缩放和布局,或者使用与设备无关的单位而不是像素 :)
当您的应用程序未声明支持 DPI 时,Windows 假定您是未正确处理 DPI 的遗留应用程序。因此,为了防止出现问题,它 假装 您实际上正在渲染到更小的显示器 - 在您的情况下,尺寸减半,然后将生成的表面放大回适当的尺寸。这会导致模糊,尤其是文本,但确保所有内容都具有适当的大小和比例 - 例如您不会看到比其中的文本更小的按钮,也不会出现重叠的控件。
如果您使用正确的布局方法,Windows Forms 和 WPF 都可以很好地支持正确处理 DPI,因此 .NET 绝对支持 DPI。但两者也都非常有能力成为 DPI 未知的,并且大多数应用程序仍然忽略 DPI 问题,因此默认值与任何其他 Windows 应用程序相同。由于没有 "legacy WPF" 应用程序,并且执行 WPF 的最简单方法也是 DPI 感知,WPF 的默认项目模板已经包含声明 DPI 感知的清单,因此我假设您在 Windows 中创建了项目表单 :) 事实上,考虑到 Windows 如今的发展方式,您可能无论如何都希望拥有一个程序集清单,以正确管理所有兼容性功能 :)
为了获得额外奖励,当您拥有多个具有不同 DPI 的显示器时,会出现更多问题 - 要声明对此的适当支持,您可以使用 <dpiAware>true/PM</dpiAware>
。这仅在 Windows 8.1+ 上可用,正确实施可能非常棘手。
这样做对我有用:
- 点击mremoteng桌面link属性
- 转到兼容性选项卡
- 在“设置”部分下选中“覆盖高 DPI 缩放行为”
- 选择可选列表中的“应用程序”。
就这些了,希望对你也有用。
我正在使用 C# 和 .Net 4.5 开发软件。我在一台 dpi 缩放比例为 100% 的旧机器上开始了这个项目。在我的新机器上,由于高分辨率显示,我必须设置 200% 的缩放比例。
在 Visual Studio 设计器中,软件的 Gui 完美呈现: Gui within the Designer.
编译软件的Gui渲染不好:Gui in compiled software.
我的期望是,因为我只使用 .Net Gui Elements/Controls 而没有自行设计的 gui 元素,windows 应该可以毫无问题地处理缩放。但正如我所见,windows 没有。
我必须在 Visual Studio 的项目设置中启用 HiDPI 选项,还是必须在我的代码中处理 HiDPI?
默认情况下,大多数 Windows 表单应用程序不支持 DPI。事实上,大多数 Windows 应用程序不支持 DPI。因此,您需要在应用程序清单中选择加入 DPI 感知:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
由于 DPI 感知是每个进程的,因此 VS 设计者在这个问题上别无选择 - 它在 Visual Studio 内运行,这是 DPI 感知。
不过,请确保在低 DPI 和高 DPI 下一切正常。 DPI 感知意味着 "I'm going to handle all DPI scaling correctly, no need to fake it for me; thanks." 希望您设计的表单具有适当的自动缩放和布局,或者使用与设备无关的单位而不是像素 :)
当您的应用程序未声明支持 DPI 时,Windows 假定您是未正确处理 DPI 的遗留应用程序。因此,为了防止出现问题,它 假装 您实际上正在渲染到更小的显示器 - 在您的情况下,尺寸减半,然后将生成的表面放大回适当的尺寸。这会导致模糊,尤其是文本,但确保所有内容都具有适当的大小和比例 - 例如您不会看到比其中的文本更小的按钮,也不会出现重叠的控件。
如果您使用正确的布局方法,Windows Forms 和 WPF 都可以很好地支持正确处理 DPI,因此 .NET 绝对支持 DPI。但两者也都非常有能力成为 DPI 未知的,并且大多数应用程序仍然忽略 DPI 问题,因此默认值与任何其他 Windows 应用程序相同。由于没有 "legacy WPF" 应用程序,并且执行 WPF 的最简单方法也是 DPI 感知,WPF 的默认项目模板已经包含声明 DPI 感知的清单,因此我假设您在 Windows 中创建了项目表单 :) 事实上,考虑到 Windows 如今的发展方式,您可能无论如何都希望拥有一个程序集清单,以正确管理所有兼容性功能 :)
为了获得额外奖励,当您拥有多个具有不同 DPI 的显示器时,会出现更多问题 - 要声明对此的适当支持,您可以使用 <dpiAware>true/PM</dpiAware>
。这仅在 Windows 8.1+ 上可用,正确实施可能非常棘手。
这样做对我有用:
- 点击mremoteng桌面link属性
- 转到兼容性选项卡
- 在“设置”部分下选中“覆盖高 DPI 缩放行为”
- 选择可选列表中的“应用程序”。
就这些了,希望对你也有用。