Comment mettre en œuvre efficace de l'undo/redo fonctionnalités pour une zone de texte
J'ai une zone de texte que je voudrais mettre en œuvre annuler/rétablir la fonctionnalité pour. Je avoir lu qu'il pourrait y avoir quelques légères fonction annuler déjà, mais qu'il est buggé? De toute façon, je tiens à mettre en œuvre à la fois annuler et rétablir la fonctionnalité de juste pour savoir comment vous aller de l'avant et de le faire.
J'ai lu sur la Memento Modèle et regarda certains sur une Générique Undo/Redo exemple sur CodeProject. Et le modèle kiiind de sens. Je n'arrive pas à les envelopper ma tête autour de la façon de la mettre en œuvre. Et comment le faire efficacement le contenu d'un TextBox
.
Bien sûr, je pourrais juste magasin textbox.Text
quand TextChanges
, mais qui serrait beaucoup de mémoire assez vite, surtout si le TextBox
contiennent beaucoup de texte.
Donc, de toute façon, je suis à la recherche de quelques conseils sur la façon de mettre en œuvre une bonne, claire et efficace de la mise en œuvre de cette fonctionnalité. À la fois en général et en particulier pour une zone de texte c",)
Vous devez vous connecter pour publier un commentaire.
L' .NET
System.ComponentModel
espace de noms est livré avec unIEditableObject
interface, vous pouvez également utiliserINotifyPropertyChanging
etINotifyPropertyChanged
. Modèle MVC serait aussi que votre interface répond à des changements dans le modèle par le biais d'événements mettant ainsi à jour ou la restauration de la valeur de votre zone de texte.Efficacement la Memento Modèle.
Avez-vous eu un coup d'oeil dans ces? Ici est un comment.
Façon rapide et simple de la version pour stocker l'état de la zone de texte
OnTextChanged
. Chaque annuler serait de retour le dernier événement dans un Tableau. Le C# Type de Pile peut être utile ici. Vous pourriez claire de l'état une fois que vous êtes hors de l'interface ou aprèsApply
.Voici une manière de le réaliser avec un minimum de code:
(C'est le code-behind de gagner un formulaire avec une zone de texte unique sur elle)
Par la mise en œuvre d'une méthode d'extension pour d'autres types d'entrée de la undoStack peut-service de l'ensemble de votre INTERFACE utilisateur, l'annulation de toutes les actions d'INTERFACE utilisateur dans l'ordre.
Une bonne solution peut être trouvée ici:
Ajouter Annuler/Rétablir ou à l'Arrière/vers l'Avant de la Fonctionnalité de votre Application
Undo/Redo Capable de zone de texte (winforms)
Le code est dans VB.NET mais vous pouvez facilement les convertir en C# sans trop d'efforts. En ligne convertisseurs sont également disponibles.
C'est le plus utile de la page que j'ai trouvé sur le sujet, plus générique, adapté pour les différents types d'objets sur le undo/redo de la pile.
Modèle De Commande
Quand je suis arrivé à le mettre en œuvre, j'ai été surpris comment simple et élégant, il a fini par être.
Ce qui en fait une victoire pour moi.
J'ai besoin de réinitialisation de la sélection, aussi, dans sa position d'origine lorsque défaire /refaire. Regarder "les Extensions de la classe", au bas de ma juste de base et bien-code de travail, pour un formulaire avec une seule zone de texte "textBox1" à essayer:
Je voudrais écouter pour un événement de changement, et quand il se produit pousser la
diff
de l'état précédent et de l'état actuel sur une pile. Les diff doit être beaucoup plus petite que le stockage de l'ensemble du texte. Aussi, vous pourriez ne pas vouloir pousser une nouvelle annulation de l'état sur la pile à chaque édition... je l'avais forfaitaire tout ce qui est tapé ensemble jusqu'à ce que l'utilisateur modifie la position du curseur, par exemple.La façon la plus intelligente est avec immuables des objets persistants. Ne jamais modifier un objet seulement faire de nouveaux objets qui changent un peu de l'ancienne version. Cela peut être fait assez efficacement que par le clonage des parties de l'arbre sur le hot chemin.
J'ai un exemple d'une pile d'annulation écrite avec un minimum de code
où A et B comme des classes avec
private setters
sur toutes les propriétés ieimmutable
vous pouvez trouver la source ici https://gist.github.com/bradphelan/5395652