我正在使用WPF RichTextBox處理文字處理器類型的應用程序。我使用的是SelectionChanged事件找出什麼字體,字體粗細,風格等是使用下面的代碼在RTB當前選擇的:WPF RichTextBox SelectionChanged性能
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等分別是使用OneWayToSource的綁定模式託管UserControl上的DependencyProperty。它們綁定到一個ViewModel,而ViewModel又有一個綁定到它的視圖,它具有字體組合框,粗體,斜體,下劃線等控件。當RTB中的選擇更改時,這些控件也會更新以反映選擇的內容。這很好。
不幸的是,它的工作原理是犧牲了性能,在選擇大量文本時會受到嚴重影響。選擇一切顯然很慢,然後使用Shift +箭頭鍵來改變選擇非常緩慢。太慢,無法接受。
我做錯了什麼?對於如何在RTB中將選定文本的屬性反映到綁定控件而不會在此過程中殺死RTB的性能,有什麼建議嗎?
感謝你的代碼,這確實提高了你所說的速度,但是當你在RTB中有大量文本時(比如說15頁左右),它仍然很不穩定。如果突出顯示所有文字並使用箭頭鍵取消選擇線條/文字,則它仍然滯後,非常明顯。所以它更好,但仍然不存在。 可以這樣的事情放在一個線程? – Scott 2010-08-19 20:43:55
我已經擴展了我的答案,讓您瞭解進一步加速需要什麼,以及線程是否會有所幫助。 – 2010-08-20 04:58:16
優秀的建議,謝謝雷。我會更詳細地研究你的建議。 – Scott 2010-08-20 20:19:55