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

Ais*_*iva 3 c# user-controls custom-controls webbrowser-control winforms

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

nos*_*tio 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我尝试了`ScrollRectangle`方式并且它有效.:) (2认同)