c# - Windows 显示设置导致 Screen.PrimaryScreen.Bounds.Width 不正确

标签 c# .net winforms

我们制作了一个使用条款应用程序,它填充用户的整个屏幕,并将文本居中于屏幕中间。

我们通过将位置设置为 Screen.PrimaryScreen.Bounds.X + 10 并将宽度设置为 Width = Screen.PrimaryScreen.Bounds.Width - 10 来实现这些目标, code> - 这有效地提供了 10px 的填充以及完美的中心文本。

但问题是,当用户将“让阅读屏幕上的内容更容易”选项更改为 125% 时,Bounds.Width 值不正确,并且文本会远离屏幕。

Make it easier to read what's on your screen, set to 125%

有趣的是,如果您将其设置为“较大 - 150%”,它可以很好地计算屏幕宽度。

我也尝试过使用Screen.PrimaryScreen.WorkingArea.Width,但这只会给出相同(不正确)的结果。

请问有办法解决吗?谢谢

(编辑)以下是生成元素的完整代码:

protected override void OnLoad(System.EventArgs e) {
    this._webBrowser = new WebBrowser {
      IsWebBrowserContextMenuEnabled = false,
      AllowWebBrowserDrop = false,
      Location = new Point(Screen.PrimaryScreen.Bounds.X + 10, Screen.PrimaryScreen.Bounds.Y + 150),
      Width = Screen.PrimaryScreen.Bounds.Width - 20,
      ScrollBarsEnabled = true,
      DocumentText = "<html><body><div>" + agreement.Terms + "</div></body></html>"
    };
}

最佳答案

看不见的东西(总是发布代码片段),发生这种情况是因为您将代码放在了错误的位置。您正在 Form 类的构造函数中设置大小。然后,由于表单最初设计为 96 DPI,因此您的表单会自动缩放以适应更大的 DPI 设置。这使得表单增大了 125%,现在变得太大了。

您必须在表单重新缩放后设置尺寸。 Load 事件处理程序是最好的机会,实际上是真正需要 Load 的少数原因之一。此时,缩放已应用,但窗口尚未可见。因此,这是覆盖 Size 和 Location 属性的最佳位置。修复:

    protected override void OnLoad(EventArgs e) {
        var scr = Screen.FromPoint(this.Location);
        this.Bounds = new Rectangle(
            scr.WorkingArea.Left + 10, scr.WorkingArea.Top,
            scr.WorkingArea.Width - 20, scr.WorkingArea.Bottom);
        base.OnLoad(e);
    }

编辑后,您不应该使用屏幕坐标来设置控件的位置和大小属性。子控件的位置与其父级的客户区相关,并且必须适合其内部。修复:

this._webBrowser = new WebBrowser {
    Location = new Point(10, 10),
    Width = this.ClientSize.Width - 20,
    Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Top,
    // etc...
};

设置 anchor 可确保其与父级一起调整大小,这可能是您想要的。此代码属于构造函数,而不是 OnLoad(),因为现在您确实希望浏览器随表单一起重新缩放。如果您使用了设计器,那么您将自动获得正确的代码。

关于c# - Windows 显示设置导致 Screen.PrimaryScreen.Bounds.Width 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24324562/

相关文章:

c# - 使用 C#/Mono 的 Iphone 应用程序

c# - 从代码中的变量访问结果 View

C# 从线程和类更新表单

c# - LINQ:根据每个项目有条件地加入两个不同的表

c# - MS Project : where to get started? 的 super 简约插件

c# - 如何在 C# 中创建对象?

c# - 在c#.net中使用crystal sap report根据条件同时打印多个不同数据的报表

c# - 进行打印预览时是否有限制?

c# - 从单个嵌套 XElement 检索值的正确方法是什么?

c# - 如何允许对 gridview 进行排序?