2017-05-01 3 views
0

Wir verwenden RichTextBox, um Text anzuzeigen. Wir haben Probleme mit geschützten Text rückgängig zu machen.undo/redo mit geschütztem Text in RichTextBox

Hier ist der Workflow, normalerweise haben wir reinen Text und in diesem Fall funktioniert das Rückgängig/Wiederholen perfekt. gelegentlich müssen wir bestimmten Text als "Geschützt" markieren. wir tun, um die Validierung und wandeln die Rtf on the fly und gehen Sie wie folgt es wieder auf das RTB:

m_rtbText.Rtf = sRtf 

das Problem nach dem Schritt über dieser Linie ist, die

m_rtbText.CanUndo 

Eigenschaft wird intern auf "False" gesetzt, haben wir alle Schritte zum Rückgängigmachen verloren. Um Ihnen ein Beispiel zu geben, ist hier, wie es vor der Validierung aussieht:

\cf1\i0\v\f2 <PSI_START_OBJECT><PSI_MEDIA><Media2><MediaID>16346</MediaID><Name>\f3\rtlch\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9</\f2\ltrch Name><FileName>N:\\media\f3\rtlch\\\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9_1.\f2\ltrch wav</FileName><Length>00:00:33.0</Length><OutCue></OutCue><Description></Description></Media2><PSI_MID_OBJECT\f3\rtlch >\v0\f0\'c7\'e1\'ca\'de\'d1\'ed\'d1 \'c7\'e1\'c5\'ce\'c8\'c7\'d1\'ed : \cf2\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9\par 
\cf1\'c7\'e1\'e3\'cf\'f8\'c9 : \cf2\f3 00:00:33.0\cf3\i\f4 .\v <\f1\ltrch PSI_END_OBJECT\f4\rtlch >\cf0\v0\f1\ltrch\par 

und hier ist das, was wie nach der Validierung aussieht:

\cf1\i0\protect\v\f2 <PSI_START_OBJECT><PSI_MEDIA><Media2><MediaID>16346</MediaID><Name>\f3\rtlch\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9</\f2\ltrch Name><FileName>N:\\media\f3\rtlch\\\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9_1.\f2\ltrch wav</FileName><Length>00:00:33.0</Length><OutCue></OutCue><Description></Description></Media2><PSI_MID_OBJECT\f3\rtlch >\v0\f0\'c7\'e1\'ca\'de\'d1\'ed\'d1 \'c7\'e1\'c5\'ce\'c8\'c7\'d1\'ed : \cf2\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9\par 
\cf1\'c7\'e1\'e3\'cf\'f8\'c9 : \cf2\f3 00:00:33.0\cf3\i\f4 .\v <\f1\ltrch PSI_END_OBJECT\f4\rtlch >\cf0\protect0\v0\f1\ltrch\par 

wie Sie sehen können, ist der einzige Unterschied ist hier die 2 "Schützen" Einträge. Textweise sind sie genau gleich.

könnte dies ein Microsoft-Bug sein oder fehle ich etwas? FYI wir sind auf .NET Framework 4.6.2, VS2015 Update3

+0

Ich hätte erwartet, dass jede Zuweisung an die Rtf-Eigenschaft die Undo/Redo-Puffer löscht, so dass sie nichts mit dem Inhalt zu tun haben, aber die Tatsache, dass eine Zuweisung von Code auftritt? – dlatikay

+0

danke für die Rückmeldung. Sie könnten richtig sein, aber was ist der richtige Weg, um das RTF zu modifizieren, während Sie den Puffer für das Rückgängigmachen richtig pflegen lassen? In meinem Fall muss ich eine Region "protected" markieren, so dass die RTF geändert werden muss ... – youkebb

+1

Dokumentation geht nicht wirklich darauf ein, aber [siehe hier] (https://www.cambiaresearch.com/articles/82/generic-undoredo-stack-in-csharp): "Bei einigen Operationen muss der gesamte RTF-Inhalt ersetzt werden, wodurch der Undo/Redo-Stapel gelöscht wird. Dies war ein Problem." Ich würde jedoch nicht so weit gehen und es als Käfer bezeichnen. Dieser Artikel funktioniert möglicherweise für Sie (Richtextbox erbt seine Rückgängig/Redu-Funktionalität aus dem Textfeld): http://stackoverflow.com/q/34091319/1132334 – dlatikay

Antwort

2

Dank dlatikay, scheint, können wir nicht direkt mit der RTF-Zuordnung arbeiten, so wird die Rückgängig-Stack verloren gehen. Der alternative Weg ist die Arbeit mit dem Selected Rtf. der folgende Code hat funktioniert:

m_rtbText.SelectionStart = 0; 
m_rtbText.SelectAll(); 
m_rtbText.SelectedRtf = sRtf; 

Dies ist im Grunde ein Ersatz. das Rückgängigmachen wird beibehalten.

Verwandte Themen