【问题标题】:Windows Forms and High DPI ScreensWindows 窗体和高 DPI 屏幕
【发布时间】:2017-10-29 19:08:36
【问题描述】:

我有一个名为 TMO (http://gotmo.co.uk) 的 Outlook 插件,它有一个 Windows 窗体,单击 Outlook 工具栏中的“帮助”按钮即可打开该窗体。问题是当我在 Surface Pro 等高 DPI 屏幕上使用 TMO 时,表单呈现非常复杂(见截图)。但是在其他笔记本电脑上,表单可以正确呈现。

事实上,如果我在 Surface Pro 上运行一个测试应用程序,我从那里加载相同的表单,它会正确呈现。请参阅随附的屏幕截图。

从我目前的阅读来看,Windows 窗体需要特殊处理才能在高 DPI 屏幕上正确呈现。但我无法弄清楚需要编写什么代码才能做到这一点。我的两个具体问题是

  1. 为什么从 Outlook 与 STand Alone 中启动时,相同的表单在高 DPI 屏幕上呈现不同。
  2. 需要(通常)编写哪些代码来处理高 DPI 屏幕上的 Windows 窗体呈现。

【问题讨论】:

    标签: c# vsto outlook-addin high-resolution


    【解决方案1】:

    在 app.config 中启用每个显示器的 DPI 感知

    <System.Windows.Forms.ApplicationConfigurationSection>
       <add key="DpiAwareness" value="PerMonitorV2" />
    </System.Windows.Forms.ApplicationConfigurationSection> 
    

    参考 - https://msdn.microsoft.com/en-us/library/mt799789(v=vs.110).aspx

    【讨论】:

    • 谢谢,但我的应用程序是针对 .NET 4.6.1 进行编码的,升级到 4.7 对我的客户来说将是一个挑战。此配置设置存在于 4.7 中。
    【解决方案2】:

    应用程序 UI 的行为可能会根据运行 UI 的线程或进程所采用的 DPI 感知模式而有所不同。 Outlook 可能以“系统”DPI 感知模式运行,而在 Outlook 进程之外运行时,您的应用程序可能以不同的模式运行。我不清楚您的代码是在 Outlook 进程中运行还是刚刚由 Outlook 进程启动,但我怀疑您正在处理意外的 DPI 感知模式更改。

    我会使用 sys-internals 来确定您的 UI 运行的模式 - 在两种不同的情况下。

    如果您验证您的 UI 代码在“系统”DPI 感知模式下运行,您可能会成功,这样当代码在不同的上下文中运行时,它就不会感到惊讶/混乱......如果这是正在发生的事情.

    在我看来,WinForms 代码假设它应该以系统 DPI 运行,或者以某种方式运行与 Outlooks 使用的不同的 DPI。

    【讨论】:

      【解决方案3】:

      我最终通过稍微重新设计表单来解决这个问题,以便它们在所有屏幕上都能正确呈现。此外以下帮助

      1. 将单个控件分组到容器中,例如分组框和面板。
      2. 在每个父容器内正确使用控件的 Anchor 属性,以便它们在其父容器内缩放。
      3. 设置父窗体的AutoScaleMode为Dpi,设置AutoSizeMode为GrowAndShrink

      我能够在表单中重复执行上述 3 个步骤,并可靠地更改它们以在高 DPI 和常规屏幕上工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-22
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 2011-03-10
        • 1970-01-01
        相关资源
        最近更新 更多