Ich arbeite an einer Textverarbeitung App mit der WPF RichTextBox. Ich bin mit dem Selection Ereignisse, um herauszufinden, was die Schriftart, Schriftstärke, Stil, etc. ist die aktuellen Auswahl in der RTB mit dem folgenden Code:WPF RichTextBox SelectionChanged Leistung
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 usw. sind jeweils ein DependencyProperty auf dem Hosting-Benutzersteuerelement mit einem Bindungsmodus von OneWayToSource. Sie sind an ein ViewModel gebunden, an das wiederum eine View gebunden ist, die über das Kombinationsfeld Font, fett, kursiv, unterstrichen usw. verfügt. Wenn sich die Auswahl in der RTB ändert, werden diese Steuerelemente ebenfalls aktualisiert, um anzuzeigen, was ausgewählt wurde. Das funktioniert großartig.
Leider funktioniert es auf Kosten der Leistung, die bei der Auswahl großer Textmengen stark beeinträchtigt wird. Alles auswählen ist merklich langsam, und dann mit etwas wie Umschalt + Pfeiltasten, um die Auswahl zu ändern ist sehr langsam. Zu langsam, um akzeptabel zu sein.
Mache ich etwas falsch? Gibt es Vorschläge, wie die Attribute des ausgewählten Textes in der RTB zu gebundenen Steuerelementen umgesetzt werden können, ohne dabei die Leistung der RTB zu beeinträchtigen?
Vielen Dank für Ihren Code, dies hat zwar die Geschwindigkeit erhöht, wie Sie gesagt haben, aber es ist immer noch ziemlich verzögert, wenn Sie eine anständige Menge an Text in der RTB haben (sagen 15 Seiten oder so). Wenn Sie den gesamten Text markieren und die Pfeiltasten verwenden, um die Auswahl von Zeilen/Wörtern aufzuheben, ist die Verzögerung noch so groß, dass sie ziemlich auffällt. Also ist es besser, aber immer noch nicht da. Kann so etwas in einen Thread eingefügt werden? – Scott
Ich habe meine Antwort erweitert, um Ihnen eine Idee zu geben, was für eine weitere Beschleunigung erforderlich wäre und ob ein Thread hilfreich wäre. –
Ausgezeichneter Rat, danke Ray. Ich werde Ihre Vorschläge genauer untersuchen. – Scott