What is the proper way to insert text with specified font in any place in measured document? I have tried with the following code but it does not set the font if just right of the caret is space, and it changes the font of the whole word if the caret is in the middle of the word.
var editor =
new
RadDocumentEditor(radRichTextEditor1.Document);
editor.ChangeFontFamily(
new
Telerik.WinControls.RichTextEditor.UI.FontFamily(
"Times New Roman"
));
editor.Insert(
"ABC"
);
8 Answers, 1 is accepted
To answer my own question, selection here is king, as always. The follwing works if selection does not exist. If one ore more selections exist one must decide what the code should do about it. The easiest way is to clear the selection before this operation.
var editor =
new
RadDocumentEditor(radRichTextEditor1.Document);
using
(DocumentPosition originalCaretPosition =
new
DocumentPosition(editor.Document.CaretPosition,
true
))
{
editor.Insert(
"ABC"
);
editor.Document.Selection.SetSelectionStart(originalCaretPosition);
editor.Document.Selection.AddSelectionEnd(editor.Document.CaretPosition);
editor.ChangeFontFamily(
new
Telerik.WinControls.RichTextEditor.UI.FontFamily(
"Times New Roman"
));
}
When inserting content directly with RadDocumentEditor, it uses the current style of the span the caret is on. To ensure that the styling you have applied is used, I would suggest you to construct a Span object and apply the desired styling to it and add it to the document using the InsertInline() method of the editor. Here is how this would look like in code:
Span span =
new
Span(
"test"
);
span.FontFamily =
new
FontFamily(
"Times New Roman"
);
this
.radRichTextEditor.InsertInline(span);
Hope this is helpful.
Regards,
Tanya
Progress Telerik
To insert text with various font styles set we can do the following:
editor.InsertInline(new Span("regular"));
editor.InsertInline(new Span("bold") { FontWeight = FontWeights.Bold });
editor.InsertInline(new Span("italic") { FontStyle = System.Drawing.FontStyle.Italic });
editor.InsertInline(new Span("underline") { UnderlineDecoration = UnderlineTypes.Line });
editor.InsertInline(new Span("strikeout") { Strikethrough = true });
But how to insert an empty paragraph with desired font size (paragraph height), for instance between words "bold" and "italic" above, where there are no spaces, so calling ChangeFontSize method before InsertParagraph would not work properly?
The methods of the editor work on the selection or if it is missing, on the element under the caret position. Here is how I modified the code so you can achieve the requirement:
editor.InsertInline(
new
Span(
"regular"
));
editor.InsertInline(
new
Span(
"bold"
) { FontWeight = FontWeights.Bold });
editor.InsertInline(
new
Span(
"italic"
) { FontStyle = System.Drawing.FontStyle.Italic });
// Add the new paragraph
editor.InsertParagraph();
// Change its properties
editor.ChangeParagraphLineSpacing(Unit.PointToDip(25), LineSpacingType.Exact);
// Add another paragraph for the following content
editor.InsertParagraph();
// Change its properties
editor.ChangeParagraphLineSpacing(1.15, LineSpacingType.Auto);
editor.InsertInline(
new
Span(
"underline"
) { UnderlineDecoration = UnderlineTypes.Line });
editor.InsertInline(
new
Span(
"strikeout"
) { Strikethrough =
true
});
Hope this will help you achieve the desired result.
Regards,
Tanya
Progress Telerik
I know only the font and its size. I don't know how to convert from those to the values that are 25 and 1.15 in your example. Paragraph height should naturally fit one character of my font and size.
Maybe I could use a trick where I insert one character, move back one place, then insert all the text and paragraphs I need, and then delete that character after the caret. Was only wondering if there is a way without using trickery.
You can maintain the line height as big as the font size requires it to be using the Single line spacing. You can set it as follows:
editor.ChangeParagraphLineSpacing(1, LineSpacingType.Auto);
The 25 and 1.15 values set different types of line spacing as it can be seen from the second parameter passed to the ChangeParagraphLineSpacing() method. The Auto line spacing type determines different values which are dependent of the font settings. If you would like to set a specific line height values and keep it always the same no matter of the content and its settings, you can use the Exact line spacing type whose measurement unit is in points.
Hope this makes things clear.
Regards,
Tanya
Progress Telerik
I think there is an error in the way the editor handles empty paragraphs. Let's take for instance demo application with its default document, with text "RadRichTextEditor for WinForms" at the beginning in font Calibri of size 28. Suppose the user wants to add A, then empty line, then C in single line, followed by the rest of the document, and to have these three new lines in Times New Roman in size 10.
If there is no empty line, but letter B in middle line, then user can set caret to document start, set the font and size, and type A<Return>B<Return>C<Return>. And it would look fine (and even then, if we set caret just after B and press Return the new paragraph will have spacing after set to 7.5 for no apparent reason).
If we want an empty line instead of B in the line, then there is no simple way to do it. Typing A<Return><Return>C<Return> would produce a huge gap between A and C (we still first set the caret, and font and size). One way to accomplish what we want is to select all new text, set font size to something other than 10, and then back to 10 (which is also weird to have to do).
Turning this into code is even harder. How would you insert A<Return><Return>C<Return> from code in Times New Roman size 10 at the demo's default document's beginning?
Thank you for providing the additional steps.
Indeed, we managed to reproduce the issue in the UI and logged it in our backlog on your behalf: RadRichTextEditor: font is reset after inserting two empty lines by pressing Enter twice. I added Telerik points in appreciation for this report.
To achieve this behavior in code, you can apply the properties after each paragraph insertion.
Regards,
Tanya
Progress Telerik