2011-06-20 18 views
5

Necesito almacenar cantidades significativas de texto enriquecido en una base de datos SQL, recuperarlo y mostrarlo.Almacenamiento y visualización de texto enriquecido

Una fuente en todo está bien, pero necesito diferentes tamaños de fuente/negrita/colores.

Por ahora estoy usando un RichTextBox (WPF) para mostrarlo, y XamlWriter.Save/XamlReader.Parse para serializarlo en cadenas para almacenar en la base de datos. Funciona bien, pero RichTextBox es MUY LENTO al mostrar el texto que básicamente no se puede usar.

¿Hay una manera rápida de hacer esto con un rendimiento aceptable?

Estoy considerando hacerlo con objetos GlyphRun, dibujando cada personaje como un mapa de bits y computando todos los requisitos de alineación para adaptarse a la imagen de destino, etc. ... Pero reinventar la rueda en texto simple coloreado/tamaño parece realmente extraño en 2011

EDIT: Gracias por las respuestas, no las he visto hasta ahora, lo siento.

El texto también lo ingresa el usuario de RichTextBox es, básicamente guardo el resultante stringXamlWriter.Save(richTextBox.Document) en la base de datos. Otros campos (double/int, etc.) también son ingresados ​​por el usuario desde TextBox es.

A medida que el usuario consulta la base de datos, páginas de texto de sólo lectura rica en colores y el formato se genera a partir de cero utilizando los campos de la base de datos, incluyendo los campos de texto enriquecido guardados anteriormente: éstos se convierten de FlowDocument s a Span s y se realiza algún reemplazo en ellos (InlineUIContainer s que alojan una clase derivada de UIElement que hace referencia a una entrada de base de datos, en el texto, como "ver [este libro]" donde [este libro] hace referencia al ID de la entrada de la base de datos). MSDN dice que todo eso es demasiado texto para TextBlock.

Esa representación de texto es la parte realmente lenta, pero no hay forma de evitarla, necesito ese formato y así es como son las WPF RichTextBox es: incluso al ingresar un pequeño texto simple en el RichTextBox es, hay un retraso entre escribir y el personaje que aparece en la pantalla ...

Por ahora sigo usando RichTextBox es pero guardo un montón de diseños prestados en la memoria (los Paragraph/Section/Span objetos) y tengo cuidado necesario volver a procesar sólo el mínimo cantidad de texto formateado posible cuando se realizan cambios/consultas o se solicitan vistas diferentes de los datos de la base de datos por parte del usuario.

Todavía no es rápido pero es OK, el cambio de toda la estructura (AvalonEdit o FormattedText o GlyphRun) no parece digno de él en este momento, demasiado trabajo, todo el API de serialización con XamlWriter.Save y XamlReader.Parse simplifica mucho (por FormattedText y GlyphRun, tendría que idear un formato de archivo para guardar el texto formateado en la base de datos).

También existe la posibilidad de utilizar el SDK OpenXML para crear documentos de Microsoft Word .docx, pero Google dice que el rendimiento de representación no es grande tampoco, y no sé si es la incorporación de un UIElement en el texto dentro de un InlineUIContainer y serialización eso sería guardado en la base de datos sería posible (mismo problema con AvalonEdit).

+0

¿Cómo se genera el texto en el primer lugar? ¿Podrías usar un FixedDocument? –

+1

¿De cuánto texto estás hablando? He trabajado mucho con los enormes FlowDocuments de WPF en un FlowDocumentViewer y todo funciona bastante bien. Probablemente deberías iniciar un generador de perfiles y ver dónde estás gastando tu tiempo; Renderizar texto * IS * es una operación costosa para WPF, pero desea asegurarse de que no está soplando el diseño de la CPU debido a una extraña estructura de documentos o estilos/colores/fuentes/separación silábica/etc. – Armentage

Respuesta

1

Considere la posibilidad de tirar RichTextBox porque es muy HUGELY SLOW (spot on).En lugar de escribir su propio editor de texto, marque AvalonEdit. En cuanto al rendimiento, supera a RichTextBox como un bebé.

O si necesita información de sólo texto que podría intentar un TextBlock - que soporta el formato simple:

<TextBlock> 
    <Run FontWeight="Bold">Hello</Run> 
    <Run Foreground="Green">World</Run> 
    <Run FontSize="24">!</Run> 
</TextBlock> 
+0

gracias, vea EDIT en la pregunta original. – SemMike

Cuestiones relacionadas