Ich habe schon eine Weile gesucht und keine einfache oder korrekte Lösung gefunden, um das folgende Problem zu lösen.
Ich habe eine mehrzeilige TextBox mit der ShortcutsEnabled = true
, die es dem Benutzer natürlich erlaubt, Änderungen, die mit den Tastaturkürzeln gemacht wurden, rückgängig zu machen oder zu wiederholen (zB Strg + ) Z ).
Jetzt möchte ich eine Schaltfläche implementieren, die den Text der TextBox löscht, es dem Benutzer aber dennoch erlaubt, die Aktion rückgängig zu machen, indem er die Standard-Rückgängig-Funktion verwendet.
Das Löschen des Textes aus der TextBox ist einfach:
%Vor% Das Problem ist, dass die Standardfunktion zum Rückgängigmachen nicht funktioniert, wenn Sie den Text auf diese Weise ersetzen.
Wenn der Benutzer jedoch den gesamten Text ( Strg + A ) auswählt und Löschen manuell drückt, wird die TextBox leer und der Benutzer kann immer noch wiederherstellen die gelöschten Daten durch Strg + Z
Ich weiß, dass das Schreiben meiner eigenen Implementierung von Undo
oder Redo
mir wahrscheinlich erlauben würde, das gewünschte Ergebnis zu erhalten, aber es muss einen anderen Weg geben.
Ich muss einfach sein, die manuelle Auswahl alle und Methode im Code zu kopieren.
Und hier brauche ich Hilfe, wie kann ich das umsetzen?
TextBox scheint keine Standard Löschen , Entfernen oder Ersetzen Textfunktion, die ich aufrufen kann.
Als Beweis für das Konzept habe ich versucht, dies mit der Methode Cut
(oder Strg + X ) zu implementieren, die tatsächlich das tut, was ich will. Der einzige Nachteil ist, dass dies möglicherweise wichtige Zwischenablagedaten ersetzt. Ich habe auch versucht, einen Workaround dafür zu finden, aber nach einigen Nachforschungen scheint es keine "richtige" oder zumindest "großartige" Möglichkeit zu geben, Daten aus der Zwischenablage wiederherzustellen.
TLDR;
Wie kann ich den Text aus einer TextBox im Code genauso löschen, wie es ein Benutzer manuell tun würde? So dass die Standardmethode Undo
immer noch aufgerufen werden kann, um den gelöschten Text wiederherzustellen?
Wie wäre es, die TextBox zu fokussieren, den gesamten Text auszuwählen und dann eine Rücktaste zu simulieren? Es ist dasselbe wie der Benutzer, der die TextBox manuell löscht. (Atleast, ich lösche Textfelder auf diese Weise)
%Vor%Ein bisschen teilweise relevant Tatsache - In WPF funktioniert die Methode Rückgängig und Wiederholen immer so, wie Sie den Text auch ändern .
Hier ist eine etwas hackische Methode, fragt MS, warum solche Methoden nicht öffentlich sind.
%Vor%Verwendung
%Vor% Wenn Sie keine Hacks mögen, können Sie P / Invoke verwenden und EM_REPLACESEL Meldung, die internen Puffer des Texteditors wie WM_SETTEXT
nicht löscht.