Я работаю над текстовым приложением, используя WPF RichTextBox. Я использую SelectionChanged событие, чтобы выяснить, какой шрифт, шрифт вес, стиль и т.д. текущего выбора в RTB, используя следующий код:WPF RichTextBox SelectionChanged 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 и т.д. являются каждый DependencyProperty на хостинге UserControl с режимом привязки OneWayToSource. Они привязаны к ViewModel, который, в свою очередь, имеет привязку к нему, которая имеет на нем поле со списком Font, жирный шрифт, курсив, подчеркивание и т. Д. Когда выбор в RTB изменяется, эти элементы управления также обновляются, чтобы отобразить выбранное. Это отлично работает.
К сожалению, это работает за счет высоких результатов, что серьезно сказывается при выборе большого количества текста. Выбор всего заметно медленный, а затем использование чего-то вроде Shift + Arrow Keys для изменения выбора происходит очень медленно. Слишком медленно, чтобы быть приемлемым.
Я что-то не так? Есть ли какие-либо предложения о том, как добиться отражения атрибутов выбранного текста в RTB для привязки элементов управления, не убивая производительность RTB в этом процессе?
Спасибо за ваш код, это действительно увеличило скорость, как вы заявили, но она по-прежнему довольно лаги, когда у вас есть приличное количество текста в RTB (скажем, 15 страниц или около того). Когда вы выделяете весь текст и используете клавиши со стрелками, чтобы отменить выбор строк/слов, он все еще достаточно медлителен, что это довольно заметно. Так что лучше, но все равно не там. Может ли что-то подобное быть помещено в поток? – Scott
Я распространил свой ответ, чтобы дать вам представление о том, что потребуется для дальнейшего ускорения, и будет ли поток полезен. –
Отличный совет, спасибо Рэй. Я рассмотрю ваши предложения более подробно. – Scott