Estoy trabajando en una aplicación de procesador de textos utilizando el WPF RichTextBox. Estoy usando el evento SelectionChanged para averiguar cuál es la fuente, el peso de la fuente, el estilo, etc., es de la selección actual en el RTB con el siguiente código:WPF RichTextBox SelectionChanged Rendimiento
private void richTextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
TextSelection selection = richTextBox.Selection;
if (selection.GetPropertyValue(FontFamilyProperty) != DependencyProperty.UnsetValue)
{
//we have a single font in the selection
SelectionFontFamily = (FontFamily)selection.GetPropertyValue(FontFamilyProperty);
}
else
{
SelectionFontFamily = null;
}
if (selection.GetPropertyValue(FontWeightProperty) == DependencyProperty.UnsetValue)
{
SelectionIsBold = false;
}
else
{
SelectionIsBold = (FontWeights.Bold == ((FontWeight)selection.GetPropertyValue(FontWeightProperty)));
}
if (selection.GetPropertyValue(FontStyleProperty) == DependencyProperty.UnsetValue)
{
SelectionIsItalic = false;
}
else
{
SelectionIsItalic = (FontStyles.Italic == ((FontStyle)selection.GetPropertyValue(FontStyleProperty)));
}
if (selection.GetPropertyValue(Paragraph.TextAlignmentProperty) != DependencyProperty.UnsetValue)
{
SelectionIsLeftAligned = (TextAlignment)selection.GetPropertyValue(Paragraph.TextAlignmentProperty) == TextAlignment.Left;
SelectionIsCenterAligned = (TextAlignment)selection.GetPropertyValue(Paragraph.TextAlignmentProperty) == TextAlignment.Center;
SelectionIsRightAligned = (TextAlignment)selection.GetPropertyValue(Paragraph.TextAlignmentProperty) == TextAlignment.Right;
SelectionIsJustified = (TextAlignment)selection.GetPropertyValue(Paragraph.TextAlignmentProperty) == TextAlignment.Justify;
}
}
SelectionFontFamily, SelectionIsBold, etc., son cada una DependencyProperty en el UserControl de alojamiento con un modo de enlace de OneWayToSource. Están vinculados a un ViewModel, que a su vez tiene una vista vinculada a él que tiene el cuadro combinado Fuente, negrita, cursiva, subrayado, etc. controla en él. Cuando la selección en el RTB cambia, esos controles también se actualizan para reflejar lo que se ha seleccionado. Esto funciona genial
Desafortunadamente, funciona a expensas del rendimiento, que se ve seriamente afectado al seleccionar grandes cantidades de texto. Seleccionar todo es notablemente lento, y luego usar algo como Mayús + teclas de flecha para cambiar la selección es muy lento. Demasiado lento para ser aceptable.
¿Estoy haciendo algo mal? ¿Hay alguna sugerencia sobre cómo lograr reflejar los atributos del texto seleccionado en el RTB a los controles vinculados sin matar el rendimiento del RTB en el proceso?
Gracias por su código, esto de hecho aumentó la velocidad como usted indicó, pero todavía es bastante lento cuando tiene una buena cantidad de texto en el RTB (digamos 15 páginas más o menos). Cuando resaltas todo el texto y utilizas las teclas de flecha para anular la selección de líneas/palabras, todavía queda lo suficientemente marcado como para que se note. Entonces es mejor, pero aún no está allí. ¿Se puede poner algo así en un hilo? – Scott
He extendido mi respuesta para darle una idea de lo que se necesitaría para una mayor aceleración, y si un hilo sería o no útil. –
Excelente consejo, gracias Ray. Voy a ver sus sugerencias con más detalle. – Scott