2010-11-28 7 views
3

Considérez le formulaire WinForms simple suivant avec une zone de texte et un contrôle webbrowser. Chaque fois que le contenu change de zone de texte, le texte est poussé au navigateur: (. Je fais quelque chose comme ça dans mon code DownMarker pour construire un éditeur Markdown avec bibliothèque MarkdownSharp de Stackoverflow)Suppression de WaitCursor pour le contrôle 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>"; 
    } 
} 

Cela fonctionne bien , sauf que le contrôle WebBrowser insiste sur l'affichage du curseur d'attente chaque fois que DocumentText est défini, même si la mise à jour du contenu du navigateur ne prend que quelques millisecondes. Le curseur de la souris scintille lorsque vous tapez dans la zone de texte.

Est-il possible de supprimer ces changements de curseur de la souris? J'ai déjà considéré les mises à jour DocumentText limitant le taux, mais je trouve que le clignotement occasionnel lors d'une mise à jour est toujours ennuyeux et je préférerais des mises à jour instantanées.


modifier: Hans réponse m'a orienté dans la bonne direction. Modification du gestionnaire d'événements TextChanged à cela semble fonctionner sans scintillement du curseur:

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: ci-dessus montre encore le curseur d'attente lorsque la page est alourdie, par exemple en ajoutant des images. Cela peut être réparable en faisant des mises à jour plus fines des éléments html qui changent, mais c'est évidemment beaucoup plus complexe.

Répondre

5

Affecter la propriété DocumentText est un Big Deal, WebBrowser le traite comme une commande de navigation. Il ne peut pas faire la différence. Ce qui prend normalement du temps, des centaines de millisecondes, assez pour justifier l'affichage du curseur d'attente.

Une approche très différente consisterait à charger un document factice et à modifier le DOM via la propriété Document. C'est assez commun dans les pages web, Ajax et javascript et quoi d'autre. Pas de curseur d'attente pour ceux-ci. Pas si sûr que cela va encore adapter votre modèle d'édition, je suppose que vous voulez charger un document HTML factice avec un <body> vide et changer le contenu du corps.

Devrait fonctionner. Le plan de sauvegarde est une mise à jour! bouton. Ce qui éviterait également d'essayer de rendre le HTML à moitié fini et donc cassé.

+1

Cela m'a pointé dans la bonne direction, merci! J'ai édité ma question pour montrer la solution finale. –