A user reported a significant performance impact with the RichTextBox in our recent update. The UI hangs repeatedly while typing.
Profiling showed a lot of garbage collections, and profiling highlighted the the Telerik class Telerik.Windows.Controls.MarkupExtensions.DocumentsResourceProvider.
#if NETCORE
private static Style ThemeStyle
{
get
{
if (themeStyle == null)
{
themeStyle = GetStyleFromApplicationTheme();
}
return themeStyle;
}
}
private static Style GetStyleFromApplicationTheme()
{
if (StyleManager.IsEnabled && StyleManager.ApplicationTheme != null)
{
var themeName = StyleManager.ApplicationTheme.GetType().Name.Trim('_').ToLower();
themeName = themeName.Replace("theme", string.Empty);
var themesGeneric = Application.LoadComponent(new Uri("/Telerik.Windows.Controls.RichTextBox;component/themes/generic.xaml", UriKind.Relative)) as ResourceDictionary;
if (themesGeneric != null)
{
var currentThemeDictionary = themesGeneric.MergedDictionaries.FirstOrDefault(rd => rd.Source != null && rd.Source.OriginalString.ToLower().Contains(themeName));
if (currentThemeDictionary != null)
{
return currentThemeDictionary[typeof(DocumentsResourceProvider)] as Style;
}
}
}
return null;
}
I copied this code into my project to debug it, and found:
As the method returns null, it means themeStyle is always null, and it will try again on the next caller. This code is called repeatedly while typing. Using my code (and reflection) to force this ThemeStyle to Fluent fixes the performance, though obviously is a huge workaround.
The scenario:
We have a document with text inside and we are executing the following steps:
Observed: Before releasing the mouse button the cursor position is correct but after releasing it the cursor position is changed to the initial selection end.
Copying content controls using DocumentFragment and then inserting them causes several undesired behaviors.
For example, if the original content control is in "Placeholder mode" (meaning the initial pre-generated text is intact), after the copy operation, its content is treated as user inserted and it is not fully selected on entering the control. Another issue is with Plain Text/Date Picket/Repeating Section control - after the copy, their Properties dialog cannot be shown.
In my usage scenario, I want to allow the users to do some specific actions like changing the font or inserting a table row in those restricted areas.
My current implementation is to modify the source code of RadRichTextBox, expose RespectDocumentProtection and RespectNonDeletableRanges, and temporarily set these properties to false before performing modifications in those restricted areas.
Currently, the properties are available in RadDocumentEditor only.
Importing a document with block-level content controls from XAML causes them to become corrupt. If you scroll to a position in which the said control is only partially visible a NullReferenceException is thrown.
A possible workaround would be to initially save the document as a DOCX (just exporting it to DOCX will not fix the issue as the information is already corrupt).
Another way to reproduce this issue:
1. Create a new document and insert a Rich Text Content Control.
2. Save the document as a XAML file.
3. Reopen the XAML file.
4. Move the caret inside the Content Control.
5. Try to insert a new line by hitting Enter - no new line is added as the content control is marked as Inline Level after the import in step 3.
Case 2:
Create a document with TOC where the content control of the TOC contains some other inlines.
RichTextBox: The RepeatButtonStyle is not merged in the RichTextBox Xaml file when declaring the styles on a window level.
Workaround: Add the dictionaries to the App.xaml file instead of the Window file.