web-dev-qa-db-fra.com

Comment ajouter \ line dans RTF à l'aide du contrôle RichTextBox

Lorsque vous utilisez le contrôle Microsoft RichTextBox, il est possible d'ajouter de nouvelles lignes comme celle-ci ...

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

Cependant, si vous affichez maintenant le rtf généré, les caractères\r\n sont convertis en\par pas\ligne

Comment insérer un code de contrôle\line dans le RTF généré?

Ce qui ne fonctionne pas:

Remplacement de jeton

Hacks comme l'insertion d'un jeton à la fin de la chaîne, puis le remplacer après coup, donc quelque chose comme ceci:

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 |

Cela a presque fonctionné, il tombe en panne si vous devez prendre en charge le texte de droite à gauche car la séquence de contrôle de droite à gauche se retrouve toujours au milieu de l'espace réservé.

Envoi de messages clés

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);
}

Cela finit également par être converti en\par

Existe-t-il un moyen de publier un message directement dans le contrôle msftedit pour insérer un caractère de contrôle?

Je suis totalement perplexe, des idées les gars? Merci de votre aide!

18
Steve Sheldon

L'ajout d'un "séparateur de ligne" Unicode (U + 2028) fonctionne autant que mes tests l'ont montré:

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);
}

Lorsque j'exécute le programme, j'obtiens:

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
}

Il a ajouté \line au lieu de \par.

20
Peter Remmers

Étant donné que vous souhaitez utiliser un code RTF différent, je pense que vous devrez peut-être oublier la méthode simpliste AppendText () et manipuler directement la propriété .Rtf de votre RichTextBox à la place. Voici un exemple ( testé) pour démontrer:

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);

Production:

Données originales RTF:

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

Nouvelles données RTF:

 {\ rtf1\ansi\ansicpg1252\deff0\deflang1033 {\ fonttbl {\ f0\fnil\fcharset0 Microsoft Sans Serif;}} 
\viewkind4\uc1\pard\f0\fs17\par 
 exemple texte0\ligne 
 exemple texte1\ligne 
 exemple texte2\ligne 
 exemple texte3\ligne 
 exemple texte4\ligne 
} 

Résultat RTF Données:

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

si vous utilisez des paragraphes pour écrire dans richtextbox, vous pouvez utiliser le même code LineBreak () que celui illustré ci-dessous

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;

J'espère que cela t'aides!

5
Ram