c# - 设置 Size 属性时 Winform 不会调整大小

标签 c# winforms window-resize

我有一个用于托管 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。这是调试器在断点处的屏幕截图:

enter image description here

我也尝试过将像素转换为点,但结果相同。大小仍然是 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

为什么表单不接受新的尺寸?

编辑:

这是表单的完整类:

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();
    }
}

最佳答案

从代码来看,一切都应该按预期工作,但是 WinForms 中有一个称为 pending layout requests 的东西,它请求更新布局。这些更改在 UI 失效后应用,因此建议使用 SuspendLayout更新关键布局/视觉元素之前的方法,然后调用 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();
}

关于c# - 设置 Size 属性时 Winform 不会调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45984883/

相关文章:

c# - Dapper/EF - 为什么当变量不在使用范围内时性能会提高

c# - DataGridView RowCount 与 Rows.Count

c# - 卸载 SQL Server Express 2005,然后在 C# ClickOnce Winform App 中安装 SQL Server 2008 R2 Express

javascript - 调整窗口大小时 jQuery Masonry 布局中断 — 流畅的无缝照片网格

c# - 更改页面上所有链接的默认url目录

c# - 条件确认按钮扩展器

c# - 即使在使用 Server.Transfer 后浏览器 URL 也会发生变化

c# - 使用 System.Windows.Forms.WebBrowser 捕获 http 数据

javascript - 如何使脚本在窗口大小调整时重新运行?

jquery - 根据窗口宽度和窗口调整大小启用功能