根据停靠在其中的webBrowser控件中的数据调整自定义用户控件的大小

我有一个名为webBrowser1webBrowser控件,它在自定义用户控件上添加并停靠为DockStyle.Full 。 Web浏览器动态接受一些HTML文本并显示它。 我禁用了webBrowser控件的滚动条。 我的问题是,只要内容有点冗长, webBrowser就会从下面隐藏它。 但是我的项目目标的要求是webBrowser不能显示滚动条或它不应该隐藏一些内容。 必须完全显示内容,而不滚动。 这意味着webBrowser停靠的用户控件必须根据webBrowser的内容调整自身大小。 所以,任何人都可以建议我如何实现这一目标? 我搜索了整个互联网,但没有发现任何东西。

您可以通过WebBrowser.Document.Window.Size获取HTML窗口的当前大小,并相应地调整容器控件的大小。 根据WebBrowser控件内容如何接收动态更新,您可能需要在每次更新后执行此操作。 如果Document.Window.Size没有按预期方式增长,您还可以尝试WebBrowser.Document.Body.ScrollRectangle

[已编辑]以下代码适用于我(IE10):

 private void Form1_Load(object sender, EventArgs e) { this.BackColor = System.Drawing.Color.DarkGray; this.webBrowser.ScrollBarsEnabled = false; this.webBrowser.Dock = DockStyle.None; this.webBrowser.Location = new System.Drawing.Point(0, 0); this.webBrowser.Size = new System.Drawing.Size(320, 200); DownloadAsync("http://www.example.com").ContinueWith((task) => { var html = task.Result; MessageBox.Show(String.Format( "WebBrowser.Size: {0}, Document.Window.Size: {1}, Document.Body.ScrollRectangle: {2}\n\n{3}", this.webBrowser.Size, this.webBrowser.Document.Window.Size, this.webBrowser.Document.Body.ScrollRectangle.Size, html)); this.webBrowser.Size = this.webBrowser.Document.Body.ScrollRectangle.Size; }, TaskScheduler.FromCurrentSynchronizationContext()); } async Task DownloadAsync(string url) { TaskCompletionSource onloadTcs = new TaskCompletionSource(); WebBrowserDocumentCompletedEventHandler handler = null; handler = delegate { this.webBrowser.DocumentCompleted -= handler; // attach to subscribe to DOM onload event this.webBrowser.Document.Window.AttachEventHandler("onload", delegate { // each navigation has its own TaskCompletionSource if (onloadTcs.Task.IsCompleted) return; // this should not be happening // signal the completion of the page loading onloadTcs.SetResult(true); }); }; // register DocumentCompleted handler this.webBrowser.DocumentCompleted += handler; // Navigate to url this.webBrowser.Navigate(url); // continue upon onload await onloadTcs.Task; // the document has been fully loaded, can access DOM here // return the current HTML snapshot return ((dynamic)this.webBrowser.Document.DomDocument).documentElement.outerHTML.ToString(); } 

要调整用户控件的大小,首先需要获取内容所需的大小。 这可以通过TextRender.MeasureText实现 ,如下所示:

 public static int GetContentHeight(string content, Control contentHolder, Font contentFont) { Font font = (contentFont != null) ? contentFont : contentHolder.Font; Size sz = new Size(contentHolder.Width, int.MaxValue); int padding = 3; int borders = contentHolder.Height - contentHolder.ClientSize.Height; TextFormatFlags flags = TextFormatFlags.WordBreak; sz = TextRenderer.MeasureText(content, contentHolder.Font, sz, flags); int cHeight = sz.Height + borders + padding; return cHeight; } 

在你的情况下,它有点棘手,因为文本包含需要过滤掉的HTML标签,以获得正确的高度..我相信这可以通过RegEx或简单算法删除<和>之间的所有内容来自字符串..您可能还需要为某些HTML标记(IE列表)创建特殊的handlig