设置 Size 属性 时 Winform 不会调整大小
Winform won't resize when setting Size property
我有一个用于托管 WebBrowser 控件的 WinForm。我想根据浏览器加载的文档大小动态调整表单大小。
我可以从 WebBrowser 控件中成功读取文档大小,并据此设置表单大小,但表单根本不会调整大小。
调整大小在 WebBrowsers DocumentCompleted 事件中进行:
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
ViewWebBrowser.Height = ViewWebBrowser.Document.Window.Size.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Window.Size.Width;
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
此事件触发得很好,文档加载和文档尺寸按预期检测到,并且根据我正在加载的页面,它们是正确的,但事件处理程序的大小始终为 37x38。这是调试器在断点处的屏幕截图:
我也尝试过将像素转换为点,但结果相同。尺寸仍然是 37x38。
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
Graphics g = this.CreateGraphics();
g.PageUnit = GraphicsUnit.Pixel;
ViewWebBrowser.Height = Convert.ToInt32(ViewWebBrowser.Document.Window.Size.Height * 72 / g.DpiY);
ViewWebBrowser.Width = Convert.ToInt32(ViewWebBrowser.Document.Window.Size.Width * 72 / g.DpiX);
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
WebBrowser 控件在表单的 Activated
事件期间加载文档:
private void WebBrowserView_Activated(object sender, EventArgs e)
{
ViewWebBrowser.Navigate(URL);
}
URL
是由演示者设置的 public 字符串 属性。演示者没有在表单上设置任何大小属性。
表单上的 AutoSize
设置为 false。我从默认值更改的表单上的唯一属性是 Text
和 FormBorderStyle
,它们设置为 SizableToolWindow
.
除了新的 Size
结构之外,我还尝试独立设置 Height
和 Width
属性,结果相同。
MinimumSize
和 MaximumSize
都设置为 0,0。将 MinimumSize
设置为 1,1 不会改变任何内容。
WebBrowser 控件上的 DockStyle
设置为 Fill
所以我只在表单上设置 Size
。
为什么表单不接受新尺寸?
编辑:
这是完整的 class 表格:
public partial class WebBrowserView : Form, IWebBrowserView
{
public WebBrowserView()
{
InitializeComponent();
}
public string URL { private get; set; }
private void WebBrowserView_Activated(object sender, EventArgs e)
{
ViewWebBrowser.Navigate(URL);
}
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var newHeight = ViewWebBrowser.Document.Window.Size.Height;
var newWidth = ViewWebBrowser.Document.Window.Size.Width;
ViewWebBrowser.Height = newHeight;
ViewWebBrowser.Width = newWidth;
this.Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
private void WebBrowserView_FormClosing(object sender, FormClosingEventArgs e)
{
ViewWebBrowser.Dispose();
}
}
尝试改用 ScrollRectangle 属性:
ViewWebBrowser.Height = ViewWebBrowser.Document.Body.ScrollRectangle.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Body.ScrollRectangle.Width;
根据评论线程,删除 Dock 样式:
ViewWebBrowser.Dock = DockStyle.None;
使用填充会干扰您的高度和宽度测量。
根据代码判断,一切都应该按预期工作,但 WinForms
中有一个叫做 pending layout requests
的东西请求更新布局。这些更改在 UI 失效后应用,因此建议使用 SuspendLayout
method before updating crucial layout/visual elements and then call ResumeLayout
来应用这些待处理的布局请求。
要应用这些更改,只需执行以下操作:
void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
SuspendLayout();
ViewWebBrowser.Height = ViewWebBrowser.Document.Window.Size.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Window.Size.Width;
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
ResumeLayout();
}
我有一个用于托管 WebBrowser 控件的 WinForm。我想根据浏览器加载的文档大小动态调整表单大小。
我可以从 WebBrowser 控件中成功读取文档大小,并据此设置表单大小,但表单根本不会调整大小。
调整大小在 WebBrowsers DocumentCompleted 事件中进行:
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
ViewWebBrowser.Height = ViewWebBrowser.Document.Window.Size.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Window.Size.Width;
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
此事件触发得很好,文档加载和文档尺寸按预期检测到,并且根据我正在加载的页面,它们是正确的,但事件处理程序的大小始终为 37x38。这是调试器在断点处的屏幕截图:
我也尝试过将像素转换为点,但结果相同。尺寸仍然是 37x38。
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
Graphics g = this.CreateGraphics();
g.PageUnit = GraphicsUnit.Pixel;
ViewWebBrowser.Height = Convert.ToInt32(ViewWebBrowser.Document.Window.Size.Height * 72 / g.DpiY);
ViewWebBrowser.Width = Convert.ToInt32(ViewWebBrowser.Document.Window.Size.Width * 72 / g.DpiX);
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
WebBrowser 控件在表单的 Activated
事件期间加载文档:
private void WebBrowserView_Activated(object sender, EventArgs e)
{
ViewWebBrowser.Navigate(URL);
}
URL
是由演示者设置的 public 字符串 属性。演示者没有在表单上设置任何大小属性。
AutoSize
设置为 false。我从默认值更改的表单上的唯一属性是 Text
和 FormBorderStyle
,它们设置为 SizableToolWindow
.
除了新的 Size
结构之外,我还尝试独立设置 Height
和 Width
属性,结果相同。
MinimumSize
和 MaximumSize
都设置为 0,0。将 MinimumSize
设置为 1,1 不会改变任何内容。
DockStyle
设置为 Fill
所以我只在表单上设置 Size
。
为什么表单不接受新尺寸?
编辑:
这是完整的 class 表格:
public partial class WebBrowserView : Form, IWebBrowserView
{
public WebBrowserView()
{
InitializeComponent();
}
public string URL { private get; set; }
private void WebBrowserView_Activated(object sender, EventArgs e)
{
ViewWebBrowser.Navigate(URL);
}
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var newHeight = ViewWebBrowser.Document.Window.Size.Height;
var newWidth = ViewWebBrowser.Document.Window.Size.Width;
ViewWebBrowser.Height = newHeight;
ViewWebBrowser.Width = newWidth;
this.Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
private void WebBrowserView_FormClosing(object sender, FormClosingEventArgs e)
{
ViewWebBrowser.Dispose();
}
}
尝试改用 ScrollRectangle 属性:
ViewWebBrowser.Height = ViewWebBrowser.Document.Body.ScrollRectangle.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Body.ScrollRectangle.Width;
根据评论线程,删除 Dock 样式:
ViewWebBrowser.Dock = DockStyle.None;
使用填充会干扰您的高度和宽度测量。
根据代码判断,一切都应该按预期工作,但 WinForms
中有一个叫做 pending layout requests
的东西请求更新布局。这些更改在 UI 失效后应用,因此建议使用 SuspendLayout
method before updating crucial layout/visual elements and then call ResumeLayout
来应用这些待处理的布局请求。
要应用这些更改,只需执行以下操作:
void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
SuspendLayout();
ViewWebBrowser.Height = ViewWebBrowser.Document.Window.Size.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Window.Size.Width;
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
ResumeLayout();
}