2011-02-19 8 views
5

Quiero permitir algunos comandos de formato simples dentro de un WPF RichTextBox pero no en otros.Cómo evitar que ciertos tipos de formato se peguen en WPF RichTextBox

He creado una barra de herramientas que permite a los usuarios aplicar negrita o cursiva, y usar listas numeradas o con viñetas. (Básicamente, solo quiero admitir los comandos de formato que serían apropiados para un blog o wiki.)

El problema es que los usuarios pueden realizar operaciones de cortar y pegar que insertan texto con colores de primer plano y de fondo, entre otros tipos de formato no permitido Esto puede ocasionar desagradables problemas de usabilidad, como que los usuarios peguen texto blanco sobre un fondo blanco.

¿Hay alguna forma de desactivar estas funciones avanzadas de formato? Si no, ¿hay alguna forma de interceptar la operación de pegar y eliminar el formato que no quiero?

Respuesta

5

puede interceptar la operación de pegado de esta manera:

void AddPasteHandler() 
    { 
     DataObject.AddPastingHandler(richTextBox, new DataObjectPastingEventHandler(OnPaste)); 
    } 

    void OnPaste(object sender, DataObjectPastingEventArgs e) 
    { 
     if (!e.SourceDataObject.GetDataPresent(DataFormats.Rtf, true)) return; 
     var rtf = e.SourceDataObject.GetData(DataFormats.Rtf) as string; 
     // Change e.SourceDataObject to strip non-basic formatting... 
    } 

y la parte sucia es mantener algunos, pero no todo el formato. La variable rtf será una cadena en formato RTF que puede usar una biblioteca de terceros para analizar, recorrer el árbol con un patrón similar al DOM y emitir nuevo RTF con solo texto, negrita y cursiva. A continuación, vuelva a incluirlo en e.SourceDataObject o en una serie de otras opciones (consulte los documentos a continuación).

Éstos son PastingHandler docs:

aquí es uno de muchos programas de análisis de RTF:

+0

Tenía miedo de tener que inspeccionar y modificar la fuente RTF. Puedo ver que esto se va a poner complicado. Gracias, Rick. Esto es justo lo que necesitaba para comenzar. – dthrasher

+0

@alldayremix No creo que funcione aquí, ya que WPF RichTextBox no se basa en el control común de texto enriquecido de Windows. –

+0

Oh wow, me perdí completamente ese detalle, mi error. 'PastingHandler' es el camino a seguir en ese momento. – alldayremix

2

Este es el código si quería a quitar todo el formato del contenido pegado (No es lo que pediste, pero puede ser útil para alguien):

void OnPaste(object sender, DataObjectPastingEventArgs e) 
    { 
     if (!e.SourceDataObject.GetDataPresent(DataFormats.Rtf, true)) return; 
     var rtf = e.SourceDataObject.GetData(DataFormats.Rtf) as string; 

     FlowDocument document = new FlowDocument(); 
     document.SetValue(FlowDocument.TextAlignmentProperty, TextAlignment.Left); 

     TextRange content = new TextRange(document.ContentStart, document.ContentEnd); 

     if (content.CanLoad(DataFormats.Rtf) && string.IsNullOrEmpty(rtf) == false) 
     { 
      // If so then load it with RTF 
      byte[] valueArray = Encoding.ASCII.GetBytes(rtf); 
      using (MemoryStream stream = new MemoryStream(valueArray)) 
      { 
       content.Load(stream, DataFormats.Rtf); 
      } 
     } 

     DataObject d = new DataObject(); 
     d.SetData(DataFormats.Text, content.Text.Replace(Environment.NewLine, "\n")); 
     e.DataObject = d; 
    } 
} 
Cuestiones relacionadas