2013-01-14 16 views
5

Eventuali duplicati:
How to prevent richTextBox to paste images within it?Come creare solo testo RichTextBox?

Se stai usando Richtextbox, ci sono diversi vantaggi in Richtextbox per esempio:

possiamo usare font color su di esso

Impostazione carattere personalizzato in una regione

allegare file su di esso .. ecc

un'occhiata alla foto: enter image description here

Ecco il mio problema:

posso solo farlo solo testo ?

Nel mio progetto, allegare file o simili non è affatto necessario. Non volevo nemmeno incollare o incollare immagini, voglio solo "solo testo" su Richtextbox

Come posso farlo?

+0

non ci sia qualcosa come una TextArea? –

+0

@ EuclidesMulémbwè - potrebbe aver bisogno di tutte le funzioni come Grassetto, Corsivo ma non le immagini –

+0

@DJKRAZE se usa readonly anche lui non sarà in grado di aggiungere del testo tramite tastiera. –

risposta

6

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; 
     } 
    } 
} 
+0

wow nice, This è una risposta molto precisa. Grazie per la tua risposta .. – Ricks

+0

Hai usato 'if (rtf (i) == '{')' Non dovrebbe essere 'if (rtf [i] == '{')' – botenvouwer

+1

Ho modificato la tua risposta un po 'per rendi il tuo esempio di codice un po 'più copiato in copia amichevole. – botenvouwer

2

Sì, è possibile.

Gestisci Ctrl + V in RichTextBox1_KeyDown, quindi controlla il formato dei dati negli Appunti: se i dati sono in chiaro, incollali; se i dati sono RTF, convertirlo in testo normale (in un buffer senza modificare il contenuto degli Appunti) e incollarlo; non incollare nessun altro tipo di dati.

Questo è un esempio parziale, solo per mostrarvi come procedere:

private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.V) 
    { 
      // suspend layout to avoid blinking 
      richTextBox2.SuspendLayout(); 

      // get insertion point 
      int insPt = richTextBox2.SelectionStart; 

      // preserve text from after insertion pont to end of RTF content 
      string postRTFContent = richTextBox2.Text.Substring(insPt); 

      // remove the content after the insertion point 
      richTextBox2.Text = richTextBox2.Text.Substring(0, insPt); 

      // add the clipboard content and then the preserved postRTF content 
      richTextBox2.Text += (string)Clipboard.GetData("Text") + postRTFContent; 

      // adjust the insertion point to just after the inserted text 
      richTextBox2.SelectionStart = richTextBox2.TextLength - postRTFContent.Length; 

      // restore layout 
      richTextBox2.ResumeLayout(); 

      // cancel the paste 
      e.Handled = true; 
    } 
}