C #: incolla RTF in RichTextBox ma continua a colorare e formattare (es .: grassetto, sottolineato, ecc.)

È ansible incollare il testo in una casella di testo RTF, mantenendo il carattere utilizzato nella casella di testo RTF per il contenuto incollato?

In altre parole, mi piacerebbe copiare qualcosa da Word che è formattato (ad esempio: un testo che utilizza un carattere X ed è sottolineato e in blu), e quindi incollarlo nel mio RichTextBox.

Desidero che il contenuto incollato abbia lo stesso carattere di quello del mio RichTextBox ma mantenga la sua colorazione e sottolineatura originali.

E ‘ansible una cosa del genere ?

Io uso Winforms.

Grazie

Questo non è ansible fuori dalla scatola. Ma puoi fare qualcosa del genere:

public void SpecialPaste() { var helperRichTextBox = new RichTextBox(); helperRichTextBox.Paste(); for(int i=0;i 

Ciò cambia il carattere dell'RTF incollato a quello del carattere che precede la posizione del cursore al momento della pasta.
Presumo che diventerà problematico abbastanza velocemente, se il testo che incollate è grande (er). Inoltre, questo può essere ottimizzato in un modo, che imposta il font una sola volta per tutti i caratteri di una riga con lo stesso font di base che Hans suggerisce.

Aggiornare:
Ecco la versione ottimizzata, che imposta il carattere per un set collegato di caratteri con lo stesso carattere originale:

 public void SpecialPaste() { var helperRichTextBox = new RichTextBox(); helperRichTextBox.Paste(); helperRichTextBox.SelectionStart = 0; helperRichTextBox.SelectionLength = 1; Font lastFont = helperRichTextBox.SelectionFont; int lastFontChange = 0; for (int i = 0; i < helperRichTextBox.TextLength; ++i) { helperRichTextBox.SelectionStart = i; helperRichTextBox.SelectionLength = 1; if (!helperRichTextBox.SelectionFont.Equals(lastFont)) { lastFont = helperRichTextBox.SelectionFont; helperRichTextBox.SelectionStart = lastFontChange; helperRichTextBox.SelectionLength = i - lastFontChange; helperRichTextBox.SelectionFont = new Font(richTextBox1.SelectionFont.FontFamily, richTextBox1.SelectionFont.Size, helperRichTextBox.SelectionFont.Style); lastFontChange = i; } } helperRichTextBox.SelectionStart = helperRichTextBox.TextLength-1; helperRichTextBox.SelectionLength = 1; helperRichTextBox.SelectionFont = new Font(richTextBox1.Font.FontFamily, richTextBox1.Font.Size, helperRichTextBox.SelectionFont.Style); richTextBox1.SelectedRtf = helperRichTextBox.Rtf; } 

È un codice piuttosto brutto e sono sicuro che può essere migliorato e pulito. Ma fa quello che dovrebbe.

Chiaramente questo non funzionerà nel modo desiderato se l’RTF negli appunti contiene un frammento con una direttiva / font. Che è molto probabile Il filtraggio del frammento RTF è pratico solo incollandolo in un helper RichTextBox. Utilizzare la proprietà SelectionFont quindi copiarlo negli Appunti e Incolla (). Oppure fallo direttamente:

  int oldpos = richTextBox1.SelectionStart; richTextBox1.SelectionLength = 0; richTextBox1.Paste(); int newpos = richTextBox1.SelectionStart; richTextBox1.SelectionStart = oldpos; richTextBox1.SelectionLength = newpos - oldpos; richTextBox1.SelectionFont = richTextBox1.Font; richTextBox1.SelectionStart = newpos; 

So che è un po ‘tardi, ma mi sono imbattuto nello stesso problema e qui c’è la mia soluzione (speriamo che questo possa aiutare gli altri):

Innanzitutto, gestisci l’evento KeyDown per il RichTextBox:

 this.richTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.RichTextBoxKeyDown); 

Quindi, controlla l’evento del tasto paste e reimposta il testo degli appunti (questo è il punto in cui avviene la magia):

  private void RichTextBoxKeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.V) { try { Clipboard.SetText(Clipboard.GetText()); } catch (Exception) { } } } 

Spiegazione: Inizierò dicendo che questo è stato testato solo con .NET 4.0. Supponendo che nessuna delle funzioni in uso sia stata modificata, questo funzionerà anche con le versioni precedenti di .NET.

Calling Clipboard.GetText () restituisce il contenuto in un formato di testo normale (esclusi i tag RTF). Quindi modifichiamo il testo che verrà incollato chiamando Clipboard.SetText () con il testo semplice recuperato da Clipboard.GetText (). Ora, quando l’evento è terminato e viene passato al controllo, eseguirà la copia recuperando il testo più recente dagli appunti (la nostra versione modificata). Il motivo per cui è racchiuso in un blocco try / catch è perché SetText a volte genera un’eccezione anche se ha copiato il testo negli appunti. Ovviamente puoi usare gli altri metodi forniti dagli Appunti per ottenere / impostare il testo, questa è solo una versione base della soluzione.

Il testo appena incollato erediterà il formato della posizione del cursore, in modo simile alla digitazione manuale nell’RTB.

Sfortunatamente questo rimuoverà anche lo stile del testo (grassetto, colorante, ecc.)

Spero che questo ti aiuti!

Vecchio lo so; La risposta di Daniel funziona per me, ma solo se sostituisco qualsiasi istanza di richTextBox1.Selection e semplicemente faccio riferimento al carattere e alle dimensioni dell’intero richTextBox1. In questo caso, qualsiasi pasta RTF I erediterà fontfamily e fontsize attualmente utilizzati da richTextBox1, preservando e lo stile RTF.

 public void SpecialPaste() { var helperRichTextBox = new RichTextBox(); helperRichTextBox.Paste(); helperRichTextBox.SelectionStart = 0; helperRichTextBox.SelectionLength = 1; Font lastFont = helperRichTextBox.SelectionFont; int lastFontChange = 0; for (int i = 0; i < helperRichTextBox.TextLength; ++i) { helperRichTextBox.SelectionStart = i; helperRichTextBox.SelectionLength = 1; if (!helperRichTextBox.SelectionFont.Equals(lastFont)) { lastFont = helperRichTextBox.SelectionFont; helperRichTextBox.SelectionStart = lastFontChange; helperRichTextBox.SelectionLength = i - lastFontChange; helperRichTextBox.SelectionFont = new Font(richTextBox1.Font.FontFamily, richTextBox1.Font.Size, helperRichTextBox.SelectionFont.Style); lastFontChange = i; } } helperRichTextBox.SelectionStart = helperRichTextBox.TextLength-1; helperRichTextBox.SelectionLength = 1; helperRichTextBox.SelectionFont = new Font(richTextBox1.Font.FontFamily, richTextBox1.Font.Size, helperRichTextBox.SelectionFont.Style); richTextBox1.Rtf = helperRichTextBox.Rtf; 

}

Ho provato a copiare il testo da un documento word e incollarlo in un RichTextBox in runtime. Tutto funziona bene Non ho regolato nulla di specifico. Basta trascinare il RichTextBox su un modulo e copiare il testo formattato dal documento MS Word.