Как изменить цвет фона элемента управления WebBrowser перед загрузкой содержимого? - PullRequest
1 голос
/ 29 октября 2011

У меня есть страница, которая содержит элемент управления WebBrowser, который часто обновляет содержимое. Я использую черный фон, но цвет по умолчанию перед загрузкой содержимого веб-браузера - белый. Я могу изменить его, загрузив небольшую HTML-строку с заданным черным фоном, но все еще есть период времени, когда веб-браузер выглядит белым, поэтому возникает эффект мерцания.

У меня такой вопрос: есть ли способ изменить цвет базового элемента управления веб-браузера?

Я пробовал несколько решений, таких как сокрытие WebBrowser до тех пор, пока содержимое не будет загружено, но ни одно из них не выглядит очень элегантным и не очень хорошо работает.

Примечание. Этот точный вопрос был задан и получен ранее для WP7 / Silverlight, но мне нужно решение для WPF / Winforms.

Ответы [ 2 ]

4 голосов
/ 29 октября 2011

Мало что можно сделать, но предотвратить отображение окна, пока браузер не инициализируется.Решение Winforms:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            CreateHandle();
            value = false;
            webBrowser1.DocumentCompleted += initializationDone;
            webBrowser1.DocumentText = "<body bgcolor=#000000></body>";
        }
        base.SetVisibleCore(value);
    }
    private void initializationDone(object sender, WebBrowserDocumentCompletedEventArgs e) {
        webBrowser1.DocumentCompleted -= initializationDone;
        this.Visible = true;
    }
}
0 голосов
/ 25 февраля 2012

У меня была такая же проблема. Форма с разделенным контейнером и веб-браузером. И не белый фон :-) Мерцание было невыносимым. В любом случае, я добился определенного успеха, применив подход программирования игр; установите таймер в вашей форме, пусть он вызывает метод обновления X раз в секунду. Метод обновления оценивает пару условий, которые определяют, должен ли веб-браузер быть видимым. Конечно, метод обновления должен быть скудным и означать:

    private void OnPollForChanges(FormBrowseAllData inData)
    {

        webBrowser1.Visible = (mWebBrowserResizing == 0) && 
                    (!mWebBrowserLoading) && 
                    webBrowser1.ReadyState >= WebBrowserReadyState.Interactive;

        if (mWebBrowserResizing>0)
        {
            mWebBrowserResizing--;
        }

когда вы сами обнаруживаете изменение размера или принудительно изменяете его, вы просто скрываете браузер для обновлений X:

    private void webBrowser1_Resize(object sender, EventArgs e)
    {
        mWebBrowserResizing = 5;
        webBrowser1.Visible = false;
    }

А когда вы делаете что-то, что может вызвать перезагрузку:

    private void SetHTML(string inHTML)
    {
        webBrowser1.Visible = false;
        mWebBrowserLoading = true;
        webBrowser1.DocumentText = inHTML;
    }

и

    void OnWebBrowserDocumentCompleted(object sender, 
            WebBrowserDocumentCompletedEventArgs e)
    {
        mWebBrowserLoading = false;
    }

Это уменьшает мерцание примерно до 5% от того, что было раньше. Конечно, это просто неудачные взломы, а не правильные решения.

PS: существует некоторое совпадение между использованием mWebBrowserLoading и проверкой webBrowser1.ReadyState. Потому что теоретически ReadyState должен меняться синхронно с mWebBrowserLoading, но в любом случае девизом здесь «лучше, чем потом сожалеть».

...