c# - linea - richtextbox html
Cómo agregar / line en RTF usando el control RichTextBox (3)
Agregar un "Separador de línea" Unicode (U + 2028) funciona tan bien como lo mostraron mis pruebas:
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);
}
Cuando ejecuto el programa, me sale:
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
}
Agregó /line
lugar de /par
.
Cuando se utiliza el control RichTextBox de Microsoft, es posible agregar nuevas líneas como esta ...
richtextbox.AppendText(System.Environment.NewLine); // appends /r/n
Sin embargo, si ahora ve el rtf generado, los caracteres / r / n se convierten a / par not / line
¿Cómo inserto un / código de control de línea en el RTF generado?
Lo que no funciona:
Reemplazo de fichas
Hacks como insertar un token al final de la cadena y luego reemplazarlo después del hecho, así que algo como esto:
string text = "my text";
text = text.Replace("||" "|"); // replace any ''|'' chars with a double ''||'' so they aren''t confused in the output.
text = text.Replace("/r/n", "_|0|_"); // replace /r/n with a placeholder of |0|
richtextbox.AppendText(text);
string rtf = richtextbox.Rtf;
rtf.Replace("_|0|_", "//line"); // replace placeholder with /line
rtf.Replace("||", "|"); // set back any || chars to |
Casi funciona, se descompone si tiene que admitir texto de derecha a izquierda, ya que la secuencia de control de derecha a izquierda siempre termina en el medio del marcador de posición.
Enviando mensajes clave
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);
}
Esto también termina convirtiéndose en un / par
¿Hay alguna forma de publicar un mensaje directamente en el control msftedit para insertar un carácter de control?
Estoy totalmente perplejo, alguna idea chicos? ¡Gracias por tu ayuda!
Dado que desea utilizar un código RTF diferente, creo que es posible que deba olvidarse del método AppendText () simplista y manipular la propiedad .Rtf de su RichTextBox directamente en su lugar. Aquí hay una muestra (probada) para demostrar:
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);
Salida:
Datos originales de RTF:
{/rtf1/ansi/ansicpg1252/deff0/deflang1033{/fonttbl{/f0/fnil/fcharset0 Microsoft Sans Serif;}} /viewkind4/uc1/pard/f0/fs17/par }
Nuevos datos RTF:
{/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 }
Datos RTF resultantes:
{/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 }
Si está usando párrafos para escribir en richtextbox, puede usar el mismo código de LineBreak () que se muestra a continuación
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;
¡Espero que esto ayude!