我们制作了一个使用条款应用程序,它填充用户的整个屏幕,并将文本居中于屏幕中间。
我们通过将位置设置为 Screen.PrimaryScreen.Bounds.X + 10
并将宽度设置为 Width = Screen.PrimaryScreen.Bounds.Width - 10 来实现这些目标,
code> - 这有效地提供了 10px 的填充以及完美的中心文本。
但问题是,当用户将“让阅读屏幕上的内容更容易”选项更改为 125% 时,Bounds.Width 值不正确,并且文本会远离屏幕。
有趣的是,如果您将其设置为“较大 - 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/