设置 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。我从默认值更改的表单上的唯一属性是 TextFormBorderStyle,它们设置为 SizableToolWindow.

除了新的 Size 结构之外,我还尝试独立设置 HeightWidth 属性,结果相同。

MinimumSizeMaximumSize 都设置为 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();
}