【发布时间】: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。我从默认值更改的唯一属性是Text 和FormBorderStyle,它们设置为SizableToolWindow。
除了新的Size 结构之外,我还尝试单独设置Height 和Width 属性,结果相同。
MinimumSize 和 MaximumSize 都设置为 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阅读
MinimumSize的Remarks部分可以看到“如果这个属性设置为一个高度为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