2010-11-28 2 views
3

Рассмотрим следующую простую форму WinForms с текстовым полем и элементом управления веб-браузером. Всякий раз, когда изменения содержимого текстового поля, текст помещается в браузере: (. Я делаю что-то вроде этого в моем DownMarker кода, чтобы построить редактор Markdown с MarkdownSharp библиотекой StackOverflow в)Suppress WaitCursor для WinForms Управление WebBrowser

public class MainForm : Form 
{ 
    public MainForm() 
    { 
     var browser = new WebBrowser() { Dock = DockStyle.Fill }; 
     var textbox = new TextBox() { Dock = DockStyle.Fill, Multiline = true }; 
     var splitter = new SplitContainer() { Dock = DockStyle.Fill }; 

     splitter.Panel1.Controls.Add(textbox); 
     splitter.Panel2.Controls.Add(browser); 
     this.Controls.Add(splitter); 

     textbox.TextChanged += delegate { browser.DocumentText = textbox.Text; }; 
     textbox.Text = "<b>hello world</b>"; 
    } 
} 

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

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


редактировать: ответ Ганса указал мне в правильном направлении. Изменение обработчика событий TextChanged на это, кажется, работает без курсора мерцания:

textbox.TextChanged += 
    delegate 
    { 
     if (browser.Document == null) 
     { 
      browser.DocumentText = "<html><body></body></html>"; 
     } 
     while ((browser.Document == null) 
      || (browser.Document.Body == null)) 
     { 
      Application.DoEvents(); 
     } 
     browser.Document.Body.InnerHtml = textbox.Text; 
    }; 

edit2: выше по-прежнему показывает курсор ожидания, когда страница сделана тяжелее, например, путем добавления изображений. Это может быть исправлено, если делать более мелкозернистые обновления только элементов html, которые меняются, но это, очевидно, намного сложнее.

ответ

5

Назначение свойства DocumentText - большое дело, WebBrowser рассматривает его как команду навигации. Это не может отличить. Обычно для этого требуется время в сотни миллисекунд, достаточное для того, чтобы оно отображало курсор ожидания.

Совсем другой подход заключается в загрузке фиктивного документа и изменении DOM через свойство Document. Это довольно распространено в веб-страницах, Ajax и javascript, а что нет. Для них нет курсора ожидания. Не уверен, что это будет по-прежнему соответствовать вашей модели редактирования, я бы предположил, что вы хотите загрузить фиктивный HTML-документ пустым <body> и изменить содержимое тела.

Должно работать. Резервный план - это обновление! кнопка. Который также избежал бы попытки сделать половину и, таким образом, сломанный HTML.

+1

Это указывало мне в правильном направлении, спасибо! Я редактировал свой вопрос, чтобы показать окончательное решение. – 2010-11-28 23:13:10

Смежные вопросы