c# - 有没有一种方法可以禁用所有 WPF 应用程序的缩放,即使 Windows 在每个监视器或系统范围内都有一定的缩放比例?

标签 c# wpf windows scaling dpi

我需要具有物理像素始终为 1:1 的 WPF 窗口(DPI 始终为 96),此时我发现没有办法做到这一点:应用程序 list 或用于感知的 API 方法是无用的,它们只是改变内容的缩放方式:作为位图或通过应用程序。我需要应用程序始终具有固定的 100% 比例,即使系统设置是每台显示器或整个系统的 200%。你们知道一些可以提供帮助的方法吗?

最佳答案

对于那些正在寻找类似解决方案的人:

我发现没有办法强制应用程序不与操作系统一起缩放,但找到了如何保持 1:1 缩放比例。

您需要做的第一件事是定义应用程序是 dpi 感知的,因此它不会由系统缩放,而是由应用程序本身缩放。这是 app.manifest 代码:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>

  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
    </windowsSettings>
  </application>
</assembly>

然后您将能够获得视觉的当前比例:

double xScale = PresentationSource.FromVisual(someVisual).CompositionTarget.TransformToDevice.M11;
double yScale = PresentationSource.FromVisual(someVisual).CompositionTarget.TransformToDevice.M22;

然后你可以将布局转换绑定(bind)到控件(在我的例子中是图像)以取消缩放效果:

<Image.LayoutTransform>
    <ScaleTransform ScaleX="{Binding ElementName=_this, Path=ScaleX}"
                    ScaleY="{Binding ElementName=_this, Path=ScaleY}" />
</Image.LayoutTransform>

请注意比例应该倒置,因此 ScaleX 和 ScaleY 将具有这些值:

ScaleX = 1 / scaleX;
ScaleY = 1 / scaleY;

关于c# - 有没有一种方法可以禁用所有 WPF 应用程序的缩放,即使 Windows 在每个监视器或系统范围内都有一定的缩放比例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538032/

相关文章:

c# - C# 的 Sonarqube 5.4 自定义规则

c# - WCF - 传输安全是否仅适用于 Intranet 方案?

c# - 如何使方法可重用于不同类型

c# - 如何检测 WPF 中 UI 上更改的数据网格项目源?

.net - Silverlight 浏览器应用程序到桌面应用程序

C++ Windows CreateChildProcess - 隐藏/不显示子进程的控制台窗口

c# - 如何调整 PDF 文档的大小以适合位图

windows - 并行执行shell进程

c# - json.net 反序列化 - 如何为图中的子对象指定转换器?

c# - 扩展现有接口(interface)