【问题标题】:Winform won't resize when setting Size property设置 Size 属性时 Winform 不会调整大小
【发布时间】:2017-08-31 23:47:52
【问题描述】:

我有一个用于承载 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 是由演示者设置的公共字符串属性。演示者没有在表单上设置任何大小属性。

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

【问题讨论】:

  • @squillman阅读MinimumSizeRemarks部分可以看到“如果这个属性设置为一个高度为0,宽度为0的Size对象, 窗体将没有超出 Windows 设置的限制的最小尺寸。” 这可能会阻止您想要的尺寸。
  • @m.rogalski 不,37x38 是我尝试设置后的结果大小。我刚刚尝试将 MinimumSize 设置为 1,1,但这并没有改变。
  • 您是否尝试在内部调用this.Size = new System.Drawing.Size(128, 128); 并检查是否有效?也许有一些线程问题或其他什么?
  • 我可以假设您设置的不是表单大小,而是一些内部控制。你能给出那个类的完整定义吗?
  • @m.rogalski SuspendLayout()ResumeLayout() 做到了!将其发布为答案,我会接受。

标签: c# winforms window-resize


【解决方案1】:

从代码来看,一切都应该按预期工作,但 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();
}

【讨论】:

    【解决方案2】:

    尝试改用 ScrollRectangle 属性:

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

    根据评论线程,删除 Dock 样式:

    ViewWebBrowser.Dock = DockStyle.None;
    

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

    【讨论】:

    • 谢谢,但结果相同...它正在读取文档属性就好了。
    • 回复:码头风格。我明白你在说什么。这可能也可以正常工作,但是将SuspendLayout()ResumeLayout() 添加到处理程序的乞求和结尾就可以了。不过谢谢!感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多