usar como wpf formatting richtextbox

wpf - como usar richtextbox c#



Cómo evitar que ciertos tipos de formato se peguen en WPF RichTextBox (2)

Aquí está el código si quiere quitar todo el formato del contenido pegado (No es lo que pidió, 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; } }

Quiero permitir algunos comandos de formato simples dentro de un WPF RichTextBox pero no otros.

Creé 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 respaldar 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 fondo y primer plano, entre otros tipos de formateo 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?


Puedes interceptar la operación de pegar así:

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 desordenada es mantener algunos, pero no todos, 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 tipo DOM y emitir un nuevo RTF con solo texto, negrita y cursiva. A continuación, vuelva a e.SourceDataObject en e.SourceDataObject o en una serie de otras opciones (consulte los documentos a continuación).

Aquí están los documentos de PastingHandler :

Este es uno de los muchos analizadores RTF: