设置Size属性时,Winform不会调整大小

时间:2017-08-31 15:16:28

标签: 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是由演示者设置的公共字符串属性。演示者不在表单上设置任何大小属性。

表单上的

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

2 个答案:

答案 0 :(得分:3)

根据代码判断,一切都应按预期工作,但pending layout requests中有一个名为WinForms的内容,它要求更新布局。在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();
}

答案 1 :(得分:0)

请尝试使用ScrollRectangle属性:

ViewWebBrowser.Height = ViewWebBrowser.Document.Body.ScrollRectangle.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Body.ScrollRectangle.Width;

根据评论主题,删除Dock样式:

ViewWebBrowser.Dock = DockStyle.None;

使用“填充”会干扰您的高度和宽度测量。