2011-01-06 13 views
15

Bei Verwendung der Microsoft RichTextBox Steuerung ist es möglich, fügen Sie neue Zeilen wie diese ...Wie line in RTF mit RichTextBox Steuerung

richtextbox.AppendText(System.Environment.NewLine); // appends \r\n 

Wenn Sie jedoch jetzt sehen die generierten rtf die \ r anhängen \ n Zeichen werden in \ par not \ Zeile konvertiert

Wie füge ich einen \ line Steuercode in das generierte RTF ein?

Was does't Arbeit:

Token Ersatz

Hacks wie ein Token am Ende des Strings eingefügt und dann nach der Tat zu ersetzen, so etwas wie diese:

Dies hat fast funktioniert, es bricht zusammen, wenn Sie von rechts nach links Text unterstützen müssen, da die Rechts-nach-Links-Steuersequenz immer in der Mitte des endet Platzhalter.

Senden Key Messages

public void AppendNewLine() 
{ 
    Keys[] keys = new Keys[] {Keys.Shift, Keys.Return}; 
    SendKeys(keys); 
} 

private void SendKeys(Keys[] keys) 
{ 
    foreach(Keys key in keys) 
    { 
     SendKeyDown(key); 
    } 
} 

private void SendKeyDown(Keys key) 
{ 
    user32.SendMessage(this.Handle, Messages.WM_KEYDOWN, (int)key, 0); 
} 

private void SendKeyUp(Keys key) 
{ 
    user32.SendMessage(this.Handle, Messages.WM_KEYUP, (int)key, 0); 
} 

Dies auch

Gibt es eine Möglichkeit eine direkt an die Msftedit Steuer messaged, um es zu einem \ par umgewandelt endet als ein Steuerzeichen einfügen?

Ich bin total ratlos, irgendwelche Ideen Jungs? Danke für Ihre Hilfe!

Antwort

17

eine Unicode "Linie Separator" (U + 2028) Hinzufügen von so weit funktioniert wie meine Tests zeigten:

private void Form_Load(object sender, EventArgs e) 
{ 
    richText.AppendText("Hello, World!\u2028"); 
    richText.AppendText("Hello, World!\u2028"); 
    string rtf = richText.Rtf; 
    richText.AppendText(rtf); 
} 

Wenn ich das Programm laufen, erhalte ich:

Hello, World! 
Hello, World! 
{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Courier New;}} 
{\colortbl ;\red255\green255\blue255;} 
\viewkind4\uc1\pard\cf1\f0\fs17 Hello, World!\line Hello, World!\line\par 
} 

Es hat hinzufügen \line anstelle von \par.

+0

Ein Hinweis, obwohl Monos RichTextBox-Emulation eher gebrochen ist und unter anderem den Zeilentrenner nicht versteht. Es erscheint als ein Box-Zeichen im Text. –

+0

Das funktionierte wie ein Zauber für mich, es erlaubte mir, den schrecklichen Hack, den wir hatten, zu entfernen. Unsere Kunden werden es Ihnen danken! –

6

Da Sie einen anderen RTF-Code verwenden möchten, müssen Sie möglicherweise die simple AppendText() -Methode vergessen und stattdessen direkt die .Rtf -Eigenschaft Ihrer RichTextBox bearbeiten. Hier ist ein Beispiel (getestet) zu demonstrieren:

RichTextBox rtb = new RichTextBox(); 
//this just gets the textbox to populate its Rtf property... may not be necessary in typical usage 
rtb.AppendText("blah"); 
rtb.Clear(); 

string rtf = rtb.Rtf; 

//exclude the final } and anything after it so we can use Append instead of Insert 
StringBuilder richText = new StringBuilder(rtf, 0, rtf.LastIndexOf('}'), rtf.Length /* this capacity should be selected for the specific application */); 

for (int i = 0; i < 5; i++) 
{ 
    string lineText = "example text" + i; 
    richText.Append(lineText); 
    //add a \line and CRLF to separate this line of text from the next one 
    richText.AppendLine(@"\line"); 
} 

//Add back the final } and newline 
richText.AppendLine("}"); 


System.Diagnostics.Debug.WriteLine("Original RTF data:"); 
System.Diagnostics.Debug.WriteLine(rtf); 

System.Diagnostics.Debug.WriteLine("New Data:"); 
System.Diagnostics.Debug.WriteLine(richText.ToString()); 


//Write the RTF data back into the RichTextBox. 
//WARNING - .NET will reformat the data to its liking at this point, removing 
//any unused colors from the color table and simplifying/standardizing the RTF. 
rtb.Rtf = richText.ToString(); 

//Print out the resulting Rtf data after .NET (potentially) reformats it 
System.Diagnostics.Debug.WriteLine("Resulting Data:"); 
System.Diagnostics.Debug.WriteLine(rtb.Rtf); 

Ausgang:

Original-RTF-Daten:

 
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}} 
\viewkind4\uc1\pard\f0\fs17\par 
} 

New RTF Daten:

 
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}} 
\viewkind4\uc1\pard\f0\fs17\par 
example text0\line 
example text1\line 
example text2\line 
example text3\line 
example text4\line 
} 

Resultierende RTF Daten:

 
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}} 
\viewkind4\uc1\pard\f0\fs17\par 
example text0\line example text1\line example text2\line example text3\line example text4\par 
} 
5

wenn Sie Absätze verwenden Sie zu schreiben, um RichTextbox das hilft unter

Paragraph myParagraph = new Paragraph(); 
FlowDocument myFlowDocument = new FlowDocument(); 

// Add some Bold text to the paragraph 
myParagraph.Inlines.Add(new Bold(new Run(@"Test Description:"))); 
myParagraph.Inlines.Add(new LineBreak()); // to add a new line use LineBreak() 
myParagraph.Inlines.Add(new Run("my text")); 
myFlowDocument.Blocks.Add(myParagraph); 
myrichtextboxcontrolid.Document = myFlowDocument; 

Hoffnung die Linebreak() verwenden denselben Code gezeigt!

+0

dies funktioniert für meine Lösung - danke – lukaszk

+0

es ist die perfekte Lösung – Ambyte

Verwandte Themen