Изменение размера пользовательского элемента управления в соответствии с данными в закрепленном в нем элементе управления webBrowser

У меня есть webBrowser управление по имени webBrowser1 который добавлен и закреплен как DockStyle.Full на пользовательском элементе управления. Веб-браузер динамически принимает текст HTML и отображает его. Я отключил полосы прокрутки webBrowser контроль. Моя проблема заключается в том, что когда содержание webBrowser скрывает это снизу. Но требование к цели моего проекта заключается в том, чтобы веб-браузер не отображал полосы прокрутки или не скрывал часть содержимого. Содержание должно быть полностью показано без прокрутки. Это означает, что пользовательский элемент управления, на котором webBrowser состыкован должен изменить свой размер в соответствии с webBrowserсодержание. Итак, кто-нибудь может предложить мне, как этого добиться? Я искал по всему интернету и ТАК, но ничего не нашел.

2 ответа

Решение

Вы можете получить текущий размер окна HTML через WebBrowser.Document.Window.Size и соответственно изменить размер элемента управления контейнера. В зависимости от того, как ваш 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();
}

Чтобы изменить размер вашего usercontrol, вам сначала нужно получить размер, необходимый для контента. Это может быть достигнуто с 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 или простого алгоритма, который удаляет весь контент между <и> из строки.. Возможно, вам также придется создать специальный handlig для некоторых HTML-тегов (списки IE)

Другие вопросы по тегам