Je travaille sur une application de type traitement de texte en utilisant le WPT RichTextBox. J'utilise l'événement SelectionChanged pour comprendre ce que la police, le poids police, le style, etc. est de la sélection dans le RTB en utilisant le code suivant:WPF RichTextBox PerformanceChanged Performance
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. sont chacun un DependencyProperty sur l'hôte UserControl avec un mode de liaison de OneWayToSource. Ils sont liés à un ViewModel, qui à son tour a une vue liée à elle qui a la zone de liste déroulante Police, gras, italique, souligné, etc. contrôles sur elle. Lorsque la sélection dans le RTB change, ces contrôles sont également mis à jour pour refléter ce qui a été sélectionné. Cela fonctionne très bien. Malheureusement, cela fonctionne au détriment des performances, ce qui est sérieusement affecté lors de la sélection de grandes quantités de texte. Sélectionner tout est très lent, puis utiliser quelque chose comme Shift + touches fléchées pour changer la sélection est très lent. Trop lent pour être acceptable.
Est-ce que je fais quelque chose de mal? Existe-t-il des suggestions sur la façon de parvenir à refléter les attributs du texte sélectionné dans le RTB pour limiter les contrôles sans détruire les performances du RTB dans le processus?
Merci pour votre code, cela a effectivement augmenté la vitesse comme vous l'avez dit, mais c'est quand même assez décalé quand vous avez une bonne quantité de texte dans le RTB (disons 15 pages environ). Lorsque vous mettez en surbrillance tout le texte et que vous utilisez les touches fléchées pour désélectionner les lignes/mots, il reste assez en retrait pour être assez visible. Donc c'est mieux, mais toujours pas là. Est-ce que quelque chose comme ça peut être mis dans un fil? – Scott
J'ai étendu ma réponse pour vous donner une idée de ce qui serait nécessaire pour accélérer encore, et si un thread serait utile ou non. –
Excellent conseil, merci Ray. Je vais examiner vos suggestions plus en détail. – Scott