C# Winform赢得';设置大小属性时不调整大小

C# Winform赢得';设置大小属性时不调整大小,c#,winforms,window-resize,C#,Winforms,Window Resize,我有一个WinForm,用于托管WebBrowser控件。我想根据浏览器加载的文档大小动态调整表单大小 我可以成功地从WebBrowser控件中读取文档大小,并据此设置表单大小,但表单根本不会调整大小 调整大小在WebBrowsers DocumentCompleted事件中: private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { Vie

我有一个WinForm,用于托管WebBrowser控件。我想根据浏览器加载的文档大小动态调整表单大小

我可以成功地从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控件在表单的
激活事件期间加载文档:

private void WebBrowserView_Activated(object sender, EventArgs e)
{
    ViewWebBrowser.Navigate(URL); 
}
URL
是演示者设置的公共字符串属性。演示者未在窗体上设置任何大小属性

表单上的
AutoSize
设置为false。我在表单上更改的默认属性只有
Text
FormBorderStyle
,设置为
SizableToolWindow

除了一个新的
Size
结构外,我还尝试独立设置
Height
Width
属性,结果相同

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

尝试改用ScrollRectangle属性:

ViewWebBrowser.Height = ViewWebBrowser.Document.Body.ScrollRectangle.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Body.ScrollRectangle.Width;
根据注释线程,删除停靠样式:

ViewWebBrowser.Dock = DockStyle.None;

使用填充将干扰您的高度和宽度测量。

根据代码判断,一切都应按预期工作,但
WinForms
中有一个名为
的待处理布局请求,它请求更新布局。这些更改在UI失效后应用,因此建议在更新关键布局/可视元素之前使用方法,然后调用应用这些挂起的布局请求

要应用这些更改,只需执行以下操作:

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

@squillman Reading Comments(斯奎尔曼阅读备注)一节中,您可以看到“如果将此属性设置为高度为0、宽度为0的大小对象,则窗体的最小大小将不会超过Windows设置的限制。”这可以防止出现您想要的大小。@m.rogalski no,37x38是我尝试设置后的结果大小。我刚刚尝试将
MinimumSize
设置为1,1,但这并没有改变任何事情。您是否尝试调用
this.Size=new System.Drawing.Size(128,128)内部并检查是否有效?可能是线程问题或其他什么?我可以假设您设置的不是表单大小,而是一些内部控制。你能展示这个类的整个定义吗?@m.rogalski
SuspendLayout()
resumellayout()
做到了!把它作为答案贴出来,我会接受的。谢谢,但结果是一样的。。。它可以读取文档属性。Re:dock style。我明白你的意思。这可能也很好,但是将
SuspendLayout()
resumellayout()
添加到请求和处理程序的末尾就成功了。不过,谢谢!我感谢你的建议。