J'ai un RichTextBox où j'ai besoin de mettre à jour la propriété Text fréquemment, mais quand je le fais, le RichTextBox "clignote" agaçant pendant qu'il rafraîchit tout au long d'un appel de méthode. J'espérais trouver un moyen facile de supprimer temporairement l'actualisation de l'écran jusqu'à ce que ma méthode soit terminée, mais la seule chose que j'ai trouvée sur le web est de surcharger la méthode WndProc. J'ai utilisé cette approche, mais avec quelques difficultés et effets secondaires, et cela rend le débogage plus difficile aussi. Il semble juste qu'il y ait une meilleure façon de faire cela. Quelqu'un peut-il me diriger vers une meilleure solution?Comment empêcher un RichTextBox d'actualiser son affichage?
Répondre
Essayez ceci:
myRichTextBox.SuspendLayout();
DoStuff();
myRichTextBox.ResumeLayout();
Pourriez-vous simplement stocker le texte dans une chaîne, faites vos manipulations sur la chaîne, et à la fin de la méthode, la stocker de nouveau dans la propriété Text?
trouvés ici: http://bytes.com/forum/thread276845.html
Je fini par envoyer un WM_SETREDRAW via SendMessage pour désactiver puis réactivez suivi d'un Invalidate() après avoir terminé la mise à jour. Cela a semblé fonctionner.
Je n'ai jamais essayé cette méthode. J'ai écrit une application avec un RTB qui a mise en évidence de la syntaxe et utilisé ce qui suit dans la classe RTB:
protected override void WndProc(ref Message m)
{
if (m.Msg == paint)
{
if (!highlighting)
{
base.WndProc(ref m); // if we decided to paint this control, just call the RichTextBox WndProc
}
else
{
m.Result = IntPtr.Zero; // not painting, must set this to IntPtr.Zero if not painting otherwise serious problems.
}
}
else
{
base.WndProc(ref m); // message other than paint, just do what you normally do.
}
}
Hope this helps.
WM_SETREDRAW a travaillé pour moi. Devrait être le même que LockWindowUpdate. –
Je suggérerais regardant LockWindowUpdate
[DllImport("user32.dll", EntryPoint="LockWindowUpdate", SetLastError=true,
ExactSpelling=true, CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
-1. Ce n'est pas son usage approprié. Voir http://blogs.msdn.com/b/oldnewthing/archive/2007/02/19/1716211.aspx. –
j'ai posé la question initiale, et la réponse qui fonctionne le mieux pour moi était l'utilisation de BoltBait de SendMessage() avec WM_SETREDRAW. Il semble avoir moins d'effets secondaires que l'utilisation de la méthode WndProc, et dans mon application, il est deux fois plus rapide que LockWindowUpdate.
Dans ma classe RichTextBox étendu, Je viens d'ajouter ces deux méthodes, et je les appelle chaque fois que je dois cesser de repeindre restart pendant que je fais un peu de traitement. Si je voulais le faire à l'extérieur de la classe RichTextBox, je pense que cela fonctionnerait simplement en remplaçant « ce » avec la référence à votre instance RichTextBox.
private void StopRepaint()
{
// Stop redrawing:
SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
// Stop sending of events:
eventMask = SendMessage(this.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero);
}
private void StartRepaint()
{
// turn on events
SendMessage(this.Handle, EM_SETEVENTMASK, 0, eventMask);
// turn on redrawing
SendMessage(this.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
// this forces a repaint, which for some reason is necessary in some cases.
this.Invalidate();
}
Une chance de compléter le code? Ce n'est pas presque compilable comme écrit actuellement. –
Voici complet et exemple de travail:
private const int WM_USER = 0x0400;
private const int EM_SETEVENTMASK = (WM_USER + 69);
private const int WM_SETREDRAW = 0x0b;
private IntPtr OldEventMask;
[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
public void BeginUpdate()
{
SendMessage(this.Handle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero);
OldEventMask = (IntPtr)SendMessage(this.Handle, EM_SETEVENTMASK, IntPtr.Zero, IntPtr.Zero);
}
public void EndUpdate()
{
SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
SendMessage(this.Handle, EM_SETEVENTMASK, IntPtr.Zero, OldEventMask);
}
- 1. Empêcher l'auto-défilement dans RichTextBox
- 2. Comment empêcher un affichage de ModalPopupExtender?
- 3. Comment utiliser le contrôle RichTextBox?
- 4. Comment un sprite enfant peut-il empêcher un événement souris d'atteindre son parent?
- 5. RichTextBox CtrlI
- 6. RichTextBox
- 7. Comment empêcher un utilisateur de modifier d'autres profils que son propre contenu dans l'application Web MVC.NET?
- 8. formatage richtextbox
- 9. Apparence RichTextBox
- 10. Meilleur Ajuster un document dans Richtextbox
- 11. RichTextBox imbriqué
- 12. Comment modifier le format de lignes spécifiées dans un RichTextBox
- 13. Comment trouver du texte répété dans un RichTextBox?
- 14. WinForms RichTextBox: comment effectuer un formatage sur TextChanged?
- 15. Comment faire pour faire défiler un RichTextBox vers le bas?
- 16. Comment trouver un TextRange dans RichTextBox (entre deux TextPointers)
- 17. Comment forcer le mode insertion dans un fichier WPF RichTextBox
- 18. Comment puis-je empêcher le contenu de redimensionner son div wrapper?
- 19. WPF richTextBox question
- 20. Comment empêcher un objet d'être collecté?
- 21. Symbole Celsius dans RichTextBox
- 22. Comment créer un affichage DataGrid dans Android?
- 23. WPF Richtextbox FontFace/FontSize
- 24. WPF RichTextBox ne supprime pas le texte
- 25. Comment WPF RIchtextbox peut-il afficher Unicode?
- 26. Comment sélectionner un TreeNode par son nom?
- 27. Comment jouer un son sur l'iPhone
- 28. Comment lire un son Windows standard?
- 29. Comment obtenir le RTF de RichTextBox
- 30. .NET RichTextBox undo
vous pouvez également ajouter myRichTextBox.Enabled = false; et le plus tard Enabled = true; – Geoff
SuspendLayout() n'aide pas vraiment ici. –