Poiché RichTextBox non dispone di una raccolta di immagini o di oggetti, è necessario utilizzare i codici di formattazione RTF. Tutti i dati di RichTextBox sono archiviati come testo normale con speciali codici di formattazione, questo è esposto dal controllo tramite la sua proprietà RTF. L'apprendimento di questa lingua del codice è essenziale se vuoi leggerlo o modificarlo, le risorse di apprendimento sono facilmente disponibili sul Web, vedi ad esempio questa panoramica. RichTextBox utilizza codici rtf semplificati rispetto a diversi editor di funzionalità complete come MS Word ecc. Pertanto, in genere è utile caricare i dati in una RTB prima di manipolarli, in questo modo verranno rimossi molti dati ridondanti.
In breve, ho scoperto che è necessario cercare gruppi rtf che iniziano con il comando "pict" o "oggetto". Sapendo che i gruppi possono essere annidati non puoi solo trovare il primo char di fine-end da lì, devi analizzare la stringa char per char mantenendo il conteggio del raggruppamento per trovare la fine di quei gruppi. Ora hai abbastanza informazioni per rimuovere quella parte della stringa. Rtf può contenere più gruppi immagine/oggetto, quindi devi farlo finché tutti non vengono rimossi. Ecco una funzione di esempio che restituisce la stringa rtf dopo aver rimosso quei gruppi:
private string removeRtfObjects(string rtf)
{
//removing {\pict or {\object groups
string pattern = "\\{\\\\pict|\\{\\\\object";
Match m = Regex.Match(rtf, pattern);
while (m.Success) {
int count = 1;
for (int i = m.Index + 2; i <= rtf.Length; i++) {
//start group
if (rtf(i) == '{') {
count += 1;
//end group
} else if (rtf(i) == '}') {
count -= 1;
}
//found end of pict/object group
if (count == 0) {
rtf = rtf.Remove(m.Index, i - m.Index + 1);
break; // TODO: might not be correct. Was : Exit For
}
}
m = Regex.Match(rtf, pattern);
//go again
}
return rtf;
}
Quando questo dovrebbe essere fatto? Hai già menzionato Incolla, c'è anche Inserisci, questi possono essere intrappolati con l'evento KeyDown in cui ottieni le informazioni degli appunti e gestiscili di conseguenza. L'impostazione e.Handled = True quando hai gestito l'operazione tu stesso segnala che il controllo non dovrebbe eseguire alcuna elaborazione predefinita per questa combinazione di tasti. Questo è anche il modo in cui blocchi le immagini incollate senza distruggere gli appunti degli utenti. Esempio:
private void RichTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
//aware of Paste or Insert
if (e.Control && e.KeyCode == Keys.V || e.Shift && e.KeyCode == Keys.I) {
if (Clipboard.ContainsImage || Clipboard.ContainsFileDropList) {
//some images are transferred as filedrops
e.Handled = true;
//stops here
} else if (Clipboard.ContainsData(DataFormats.Rtf)) {
RichTextBox rtbox = new RichTextBox();
//use a temp box to validate/simplify
rtbox.Rtf = Clipboard.GetData(DataFormats.Rtf);
this.RichTextBox1.SelectedRtf = this.removeRtfObjects(rtbox.Rtf);
rtbox.Dispose();
e.Handled = true;
}
}
}
fonte
2013-01-14 15:35:17
non ci sia qualcosa come una TextArea? –
@ EuclidesMulémbwè - potrebbe aver bisogno di tutte le funzioni come Grassetto, Corsivo ma non le immagini –
@DJKRAZE se usa readonly anche lui non sarà in grado di aggiungere del testo tramite tastiera. –