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

3
我有一个名为webBrowser1的webBrowser控件,它被添加并停靠在一个自定义用户控件上,停靠方式为DockStyle.Full。该Web浏览器可以动态地接受一些HTML文本并将其显示出来。我已经禁用了webBrowser控件的滚动条。我的问题是,当内容较长时,webBrowser会从底部隐藏它。但是我的项目目标要求webBrowser不能显示滚动条,也不应该隐藏一些内容,必须完整地显示内容而无需滚动。这意味着停靠在webBrowser上的用户控件必须根据webBrowser的内容重新调整大小。那么,有人能告诉我如何实现吗?我在互联网和SO上搜索了所有内容,但没有找到任何相关信息。
2个回答

5
您可以通过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<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();
}

两个属性都显示了“NullReferenceException”。即使在此之前我已经设置了“DocumentText”。 - Aishwarya Shiva

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标签,以获取正确的高度。我相信这可以通过正则表达式或简单算法来实现,该算法从字符串中删除<和>之间的所有内容。您可能还需要为某些HTML标记(例如列表)创建特殊处理。

我无法删除HTML文本中的<br/>等标签,因为它们会改变高度。此外,您的函数对于我添加的任何内容都返回23长度。 - Aishwarya Shiva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接