【问题标题】:Report Viewer - scaling issue with system DPI change报告查看器 - 系统 DPI 更改的缩放问题
【发布时间】:2014-06-18 03:22:12
【问题描述】:

我有一个 Winforms 应用程序(在 Visual Studio 2010 中),其中包含一个报表查看器控件,用于预览和打印 A4 大小的报表。

一位用户将他的 Windows 字体大小设置为 150%(即系统 DPI 更改),当他运行报表时,报表查看器预览和打印报表中的大小都缩小为 2/3。

包含报表查看器的表单的 AutoScaleMode 属性设置为“字体”,尽管如果我更改它似乎不会影响报表。

这不是字体(缺失/缩放)问题,因为我有一个示例程序来演示这个问题,它只包含一个占据整个页面的矩形。

似乎我需要某种方法在报告本身中指定它应该以 96dpi 呈现,而不管系统 dpi 设置如何,但看不到任何我可以指定的地方。我错过了什么?

谢谢, 大卫

【问题讨论】:

  • 同样的问题,但在 2012 年。打印预览和打印的报告都包含缩小的内容。这就像一个计算来补偿增加的屏幕 DPI 出错了。您找到解决此问题的方法了吗?
  • @Gavin - 不,我没有找到解决办法。作为一种解决方法,在 .exe 的兼容性设置中选择“禁用高 DPI 设置时的显示缩放”似乎可以解决问题(这是在 Windows 7 上)。
  • 感谢@davidl,我现在至少为有此问题的用户提供了解决方案。
  • @davidl 您是否尝试过将 AutoScaleMode 设置为 Dpi 并从 answer 添加一段代码?

标签: c# winforms reportviewer


【解决方案1】:

我遇到了同样的问题。 WinForms ReportViewer 已经具备 DPI 感知能力,并将进行自己的缩放。您只需告诉系统您的应用程序可以识别 DPI,这样系统就不会在之后尝试对其进行缩放。

如果您还没有向您的应用程序添加清单,然后在标签内添加以下内容:

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

您也可以使用 API 函数 SetProcessDPIAware,但建议不要: http://msdn.microsoft.com/en-us/library/ms633543.aspx

【讨论】:

  • 我遇到了同样的问题,这解决了它。
  • 我有一个 Win Forms ReportViewer 使用 WindowsFormsHost 控件嵌入到 WPF 应用程序中。 WPF 应用程序始终将自己注册为可识别 DPI,但 ReportViewer 表现出此问题行为,因此此解决方案无济于事。
  • 我应该把这段代码放在哪里?我将它添加到 appname.exe.manifest 文件的底部并收到错误“由于 Windows 并排错误,激活失败。”
  • 谢谢!这解决了我几天来一直试图解决的问题!
  • 这是一个救生员!要添加清单,只需选择添加新项目,然后在您的项目中选择清单
【解决方案2】:

作为对@JoMan 所说内容的补充回答(因为我无法对他的帖子发表评论),请记住,您可以相对简单地手动扩展应用中的 UI 元素。因此,请按照 JOMan 的建议,让您的应用程序了解 DPI(以便您的系统不会扭曲打印结果)。你可以使用这样的东西......

Using g As System.Drawing.Graphics = WindowsForm.CreateGraphics
 Dim sngScaleFactor As Single = 1
 Dim sngFontFactor As Single = 1 

 If (graphics.Dpix >= 96) Then
      sngScaleFactor = (graphics.Dpix / 96) - 0.25
      sngFontFactor = (graphics.Dpix / 96) - 0.25
 End If

 If WindowsForm.AutoScaleDimensions = WindowsForm.CurrentAutoScaleDimensions Then
            WindowsForm.Scale(sngScaleFactor)
            For Each child As Control In WindowsForm.Controls
                ScaleFontRecursively(child, sngFontFactor)
            Next
 End If
End Using

我相信很多人会争辩(正确!)您通常不想检测 DPI 并手动缩放自己,但是 dpi 自动缩放导致打印的 Microsoft 报告的错误在 2018 年仍然很突出,所以这提供了一个简单的解决方法。

【讨论】:

  • 这段代码会去哪里?在 on load 事件中的报表查看器表单中,也许?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2023-03-23
  • 2018-03-07
相关资源
最近更新 更多