我有一个webBrowser
名为的控件webBrowser1
,它被添加并停靠DockStyle.Full
在自定义用户控件上。网络浏览器动态接受一些 HTML 文本并显示它。webBrowser
我禁用了控件的滚动条。我的问题是,只要内容有点长,webBrowser
就会从下面隐藏它。但是我的项目目标的要求是 webBrowser 不能显示滚动条或者它不应该隐藏一些内容。内容必须按原样完整显示,无需滚动。这意味着webBrowser
停靠的用户控件必须根据webBrowser
的内容调整自身大小。那么,有人可以建议我如何实现这一目标吗?我在整个互联网上进行了搜索,但一无所获。
问问题
4203 次
2 回答
5
您可以通过WebBrowser.Document.Window.Size获取 HTML 窗口的当前大小,并相应地调整容器控件的大小。根据您的WebBrowser
控件内容接收动态更新的方式,您可能需要在每次更新后执行此操作。WebBrowser.Document.Body.ScrollRectangle
如果Document.Window.Size
没有以预期的方式增长,您也可以尝试。
[编辑]以下代码适用于我(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<string> DownloadAsync(string url)
{
TaskCompletionSource<bool> onloadTcs = new TaskCompletionSource<bool>();
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();
}
于 2013-09-16T01:53:26.547 回答
1
要调整用户控件的大小,您首先需要获取内容所需的大小。这可以通过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 列表)创建特殊的句柄
于 2013-09-16T10:43:27.467 回答