To reproduce: - Add some comments and try to navigate through them. - Try add or show/hide the comments while the cursor is in one of the comments. Workaround: Create a custom RichTextEditorRibbonBar and override the following methods: Public Class MyRichTextEditorRibbonBar Inherits RichTextEditorRibbonBar Protected Overrides Sub ButtonNewComment_Click(sender As Object, e As EventArgs) Dim command As New InsertCommentCommand(Me.AssociatedRichTextEditor.RichTextBoxElement) Me.ExecuteCommand(command) End Sub Protected Overrides Sub ButtonDeleteComment_Click(sender As Object, e As EventArgs) Dim command As New DeleteCommentCommand(Me.AssociatedRichTextEditor.RichTextBoxElement) Me.ExecuteCommand(command) End Sub Protected Overrides Sub ButtonPreviousComment_Click(sender As Object, e As EventArgs) Dim command As New GoToPreviousCommentCommand(Me.AssociatedRichTextEditor.RichTextBoxElement) Me.ExecuteCommand(command) End Sub Protected Overrides Sub ButtonNextComment_Click(sender As Object, e As EventArgs) Dim command As New GoToNextCommentCommand(Me.AssociatedRichTextEditor.RichTextBoxElement) Me.ExecuteCommand(command) End Sub Protected Overrides Sub ToggleButtonShowHideComments_ToggleStateChanged(sender As Object, args As StateChangedEventArgs) Dim command As New ToggleCommentsCommand(Me.AssociatedRichTextEditor.RichTextBoxElement) Me.ExecuteCommand(command) End Sub Protected Overrides Sub ButtonDeleteAllComments_Click(sender As Object, e As EventArgs) Dim command As New DeleteAllCommentsCommand(Me.AssociatedRichTextEditor.RichTextBoxElement) Me.ExecuteCommand(command) End Sub Protected Overrides Sub HandleDocumentCommandExecuted(document As RadDocument) MyBase.HandleDocumentCommandExecuted(document) Dim hasComments As Boolean = Me.AssociatedRichTextEditor.Document.EnumerateChildrenOfType(Of CommentRangeStart)().Count() > 0 Me.buttonPreviousComment.Enabled = hasComments Me.buttonNextComment.Enabled = hasComments Me.buttonDeleteComment.Enabled = hasComments Me.buttonDeleteAllComments.Enabled = hasComments End Sub End Class
To reproduce: 1.Use the provided xml file in the following article: http://www.telerik.com/help/winforms/richtexteditor-localization.html and change these strings: "Documents_ParagraphPropertiesDialog_TextAlignment_Center": "Mittig"; "Documents_ParagraphPropertiesDialog_TextAlignment_Justify": "Block"; "Documents_ParagraphPropertiesDialog_TextAlignment_Left": "Links"; "Documents_ParagraphPropertiesDialog_TextAlignment_Right": "Rechts"; 2.Afterwards, specify the RichTextBoxLocalizationProvider.CurrentProvider by loading the modified file. 3.Run the application, select some paragraph and try to change its alignment. As a result when the ParagraphPropertiesDialog is opened, incorrect alignment text is displayed in the drop-down. If you select a new value a handled ArgumentException is thrown and the paragraph is not aligned at all. Workaround: use a custom ParagraphPropertiesDialog: public Form1() { RichTextBoxLocalizationProvider.CurrentProvider = RichTextBoxLocalizationProvider.FromFile(@"..\..\RichTextBoxStrings - Copy.xml"); InitializeComponent(); this.radRichTextEditor1.RichTextBoxElement.ParagraphPropertiesDialog = new CustomDialog(); } public partial class CustomDialog : ParagraphPropertiesDialog { public CustomDialog() { InitializeComponent(); FieldInfo fi = typeof(ParagraphPropertiesDialog).GetField("radButtonOK", BindingFlags.Instance | BindingFlags.NonPublic); RadButton btn = fi.GetValue(this) as RadButton; btn.MouseDown += btn_MouseDown; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (selectedItem != null) { ButtonAlignement.Text = selectedItem.Text; } } public RadDropDownButton ButtonAlignement { get { FieldInfo fi = typeof(ParagraphPropertiesDialog).GetField("radDropDownButtonAlignement", BindingFlags.Instance | BindingFlags.NonPublic); RadDropDownButton radDropDownButtonAlignement = fi.GetValue(this) as RadDropDownButton; return radDropDownButtonAlignement; } } RadMenuItem selectedItem = null; RadDropDownButton radDropDownButtonAlignement = null; private void btn_MouseDown(object sender, MouseEventArgs e) { foreach (RadMenuItem item in ButtonAlignement.Items) { if (item.Text == ButtonAlignement.Text) { selectedItem = item; break; } } if (selectedItem != null) { ButtonAlignement.Text = selectedItem.Tag.ToString(); } } }
To reproduce: use the code snippet below. Please refer to the attached screenshot. public Form1() { RichTextBoxLocalizationProvider.CurrentProvider = new MyRichTextBoxLocalizationProvider(); InitializeComponent(); } public class MyRichTextBoxLocalizationProvider : RichTextBoxLocalizationProvider { public override string GetLocalizedString(string id) { return base.GetLocalizedString(id); } } Workaround: Modify the XML file containing all the strings RichTextBoxLocalizationProvider.CurrentProvider = RichTextBoxLocalizationProvider.FromFile(@"C:\RichTextBoxStrings.xml");. You can download a XML file that contains all the currently used strings from here: http://www.telerik.com/docs/default-source/ui-for-winforms/richtextboxstrings.zip?sfvrsn=2
Currently, the scrollbars width is calculated only according to SystemInformation.VerticalScrollBarWidth. Workaround: class MyRTE : RadRichTextEditor { protected override void CreateChildItems(RadElement parent) { var rte = new MyRTEElement(); typeof(RadRichTextEditor).GetField("richTextBox", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(this, rte); parent.Children.Add(rte); } } public class MyRTEElement : RadRichTextBox { protected override SizeF ArrangeOverride(SizeF finalSize) { base.ArrangeOverride(finalSize); System.Drawing.RectangleF finalRect = new System.Drawing.RectangleF(System.Drawing.PointF.Empty, finalSize); System.Drawing.RectangleF clientRect = finalRect; System.Drawing.RectangleF horizontalScrollRect = System.Drawing.RectangleF.Empty; System.Drawing.RectangleF verticalScrollRect = System.Drawing.RectangleF.Empty; System.Drawing.RectangleF presenterArea = clientRect; if (this.VerticalScrollBar.Visibility != Telerik.WinControls.ElementVisibility.Collapsed) { verticalScrollRect = new System.Drawing.RectangleF( new System.Drawing.PointF(finalRect.Right - this.VerticalScrollBar.Size.Width, finalRect.Top), new System.Drawing.SizeF(this.VerticalScrollBar.Size.Width, finalRect.Height)); } if (this.HorizontalScrollBar.Visibility != Telerik.WinControls.ElementVisibility.Collapsed) { horizontalScrollRect = new System.Drawing.RectangleF( new System.Drawing.PointF(finalRect.Left, finalRect.Bottom - this.HorizontalScrollBar.Size.Height), new System.Drawing.SizeF(finalRect.Width, this.HorizontalScrollBar.Size.Height)); if (this.VerticalScrollBar.Visibility != Telerik.WinControls.ElementVisibility.Collapsed) { horizontalScrollRect.Width -= this.VerticalScrollBar.Size.Width; verticalScrollRect.Height -= this.HorizontalScrollBar.Size.Height; } } presenterArea.Width -= verticalScrollRect.Width; presenterArea.Height -= horizontalScrollRect.Height; if (this.RightToLeft) { horizontalScrollRect = Telerik.WinControls.Layouts.LayoutUtils.RTLTranslateNonRelative(horizontalScrollRect, clientRect); verticalScrollRect = Telerik.WinControls.Layouts.LayoutUtils.RTLTranslateNonRelative(verticalScrollRect, clientRect); presenterArea = Telerik.WinControls.Layouts.LayoutUtils.RTLTranslateNonRelative(presenterArea, clientRect); } this.VerticalScrollBar.Arrange(verticalScrollRect); this.HorizontalScrollBar.Arrange(horizontalScrollRect); var contentPresenter = typeof(RadRichTextBox).GetField("contentPresenter", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(this) as ContentControl; contentPresenter.Arrange(presenterArea); return finalSize; } protected override SizeF MeasureOverride(SizeF availableSize) { base.MeasureOverride(availableSize); System.Drawing.SizeF horizontalScrollSize = System.Drawing.SizeF.Empty; System.Drawing.SizeF verticalScrollSize = System.Drawing.SizeF.Empty; System.Drawing.SizeF presenterSize = availableSize; if (this.VerticalScrollBar.Visibility != Telerik.WinControls.ElementVisibility.Collapsed) { verticalScrollSize = new System.Drawing.SizeF(this.VerticalScrollBar.Size.Width, availableSize.Height); } if (this.HorizontalScrollBar.Visibility != Telerik.WinControls.ElementVisibility.Collapsed) { horizontalScrollSize = new System.Drawing.SizeF(availableSize.Width, this.HorizontalScrollBar.Size.Height); } presenterSize.Width -= verticalScrollSize.Width; presenterSize.Height -= horizontalScrollSize.Height; //presenterSize = base.GetClientRectangle(presenterSize).Size; this.VerticalScrollBar.Measure(verticalScrollSize); this.HorizontalScrollBar.Measure(horizontalScrollSize); var contentPresenter = typeof(RadRichTextBox).GetField("contentPresenter", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(this) as ContentControl; contentPresenter.Measure(presenterSize); return availableSize; } }
Workaround: public partial class Form1 : Form { private Telerik.WinForms.RichTextEditor.RichTextBoxUI.Dialogs.SpellCheckingDialog spellDlg; public Form1() { InitializeComponent(); } private void radButton1_Click(object sender, EventArgs e) { this.spellDlg = new Telerik.WinForms.RichTextEditor.RichTextBoxUI.Dialogs.SpellCheckingDialog(); Telerik.WinForms.Documents.UI.Extensibility.SpellCheckingUIManager manager = new Telerik.WinForms.Documents.UI.Extensibility.SpellCheckingUIManager(this.radRichTextEditor1.RichTextBoxElement); FieldInfo fi = this.spellDlg.GetType().GetField("suggestionsListBox", BindingFlags.NonPublic | BindingFlags.Instance); RadListControl suggestionListBox = fi.GetValue(this.spellDlg) as RadListControl; suggestionListBox.DataBindingComplete -= suggestionListBox_DataBindingComplete; suggestionListBox.DataBindingComplete += suggestionListBox_DataBindingComplete; this.spellDlg.ShowDialog(manager, this.radRichTextEditor1.RichTextBoxElement); } private void suggestionListBox_DataBindingComplete(object sender, ListBindingCompleteEventArgs e) { if (((RadListControl)sender).Items.Count == 0) { FieldInfo fiBtnChange = this.spellDlg.GetType().GetField("buttonChange", BindingFlags.NonPublic | BindingFlags.Instance); RadButton btnChange = fiBtnChange.GetValue(this.spellDlg) as RadButton; btnChange.Enabled = false; FieldInfo fiBtnChangeAll = this.spellDlg.GetType().GetField("buttonChangeAll", BindingFlags.NonPublic | BindingFlags.Instance); RadButton btnChangeAll = fiBtnChangeAll.GetValue(this.spellDlg) as RadButton; btnChangeAll.Enabled = false; } } }
To reproduce: - Add RichTextEditorRibbonBar and associate it with RadRichTextEditor at design time. - Show the form and then force the garbage collector. Workaround: - Associate the controls in the load event. - Set the AssociatedRichTextEditor to null just before the form is closed. protected override void OnLoad(EventArgs e) { base.OnLoad(e); richTextEditorRibbonBar1.AssociatedRichTextEditor = radRichTextEditor1; } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { richTextEditorRibbonBar1.AssociatedRichTextEditor = null; base.OnClosing(e); }
The PreviewEditorKeyDown event is not fired when the user is typing in the editor. Workaround Create custom input behaviour: www.telerik.com/help/winforms/richtexteditor-keyboard-support.html
Copy the following image from the browser and paste it to RadRichTextEditor: https://en.wikipedia.org/wiki/File:Telerik_Logo.png. IOException is thrown when pasting the image. However, it is loaded at the end. Export the image with the following code: private void radButton1_Click(object sender, EventArgs e) { DocumentFormatProviderBase provider = new XamlFormatProvider(); byte[] byteData = provider.Export(this.radRichTextEditor1.Document); } ArgumentException occurs. Workaround: save the image first and copy it from Paint for example.
Due to a namespace conflict, projects which reference Telerik.WinControls.RichTextBox.dll and target .NET 4.5 or above, cannot be built successfully if they are using some of the conflicting types. The conflict comes from the ICommand interface (https://msdn.microsoft.com/en-us/library/system.windows.input.icommand%28v=vs.110%29.aspx) which was moved from PresentationCore.dll to System.dll in .NET 4.5.
Workaround use the following code to programatically toggle the spell check mode: RadRibbonBarGroup spellCheckGroup = ((RibbonTab)richTextEditorRibbonBar1.CommandTabs[0]).Items[3] as RadRibbonBarGroup; RadToggleButtonElement toggleButton = spellCheckGroup.Items[1] as RadToggleButtonElement; if (this.radRichTextEditor1.IsSpellCheckingEnabled) { toggleButton.CheckState = CheckState.Unchecked; } else { toggleButton.CheckState = CheckState.Checked; }
Hello Telerik, your control changed the format to Verdana when import rtf. But only in the first line. And only the first line is Arial. Is the first line with any other font formated, its all ok. Here the code: string rtfText = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Arial;}{\f1\fnil\fcharset0 Tahoma;}{\f2\fnil\fcharset0 Times New Roman;}{\f3\fnil\fcharset0 Arial Unicode MS;}{\f4\fnil\fcharset0 Calibri;}} {\colortbl ;\red0\green0\blue0;} \viewkind4\uc1\pard\tx300\tx600\tx900\tx1200\tx1500\tx1800\tx2100\tx2400\tx2700\tx3000\tx3300\tx3600\tx3900\tx4200\tx4500\cf1\b\fs32 Arial\f1\par Tahoma\par \f2 Times New Roman\par \f0 Arial\f2\par \f3 Arial Unicode MS\par \f4 Calibri\b0\f0\fs20\par }"; RtfFormatProvider rtf = new RtfFormatProvider(); this.radRichTextEditor1.Document = rtf.Import(rtfText); this.richTextBox1.Rtf = rtfText; In the screenshot you can see, left the standard .net rtf control and rigth the Telerik richtexteditor. The zip is the sample project.
The "Style" gallery is reinitialized each time the AssociatedRichTextEditor is changed.
To reproduce: - Add RichTextEditorRuler and RichTextEditor to a form. - Add some tab stops in the ruler and press the tab key. Workaround: void radRichTextEditor1_CommandExecuting(object sender, Telerik.WinForms.Documents.RichTextBoxCommands.CommandExecutingEventArgs e) { if (e.Command is IncrementParagraphLeftIndentCommand) { e.Cancel = true; TabForwardCommand tabForward = new TabForwardCommand(this.radRichTextEditor1.RichTextBoxElement); tabForward.Execute(); } }
To reproduce: - Add several RadRichTextEditors to a form. - Change the icon of the FontPropertiesDialog. - Close the form and force the garbage collector. Workaround: protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); foreach (var item in this.Controls) { var rte = item as RadRichTextEditor; if (rte != null) { ((FontPropertiesDialog)rte.RichTextBoxElement.FontPropertiesDialog).Dispose(); } } }
To reproduce: - Add some text so the scrollbars appear. - Scroll up and down with the mouse wheel. - When you scroll to the bottom you will notice that there is extra space after the document end. Workaround: http://www.telerik.com/forums/backspace-key-does-not-properly-invalidate-editor#sP5qkJX4b0S8jwZ3MUGTmQ
When the RadRichTExtEditor.Document is rapidly changed not all memory is released Workaround: Point loc = radRichTextEditor1.Location; Size size = radRichTextEditor1.Size; radRichTextEditor1.Dispose(); radRichTextEditor1 = new RadRichTextEditor(); radRichTextEditor1.Location = loc; radRichTextEditor1.Size = size; this.Controls.Add(radRichTextEditor1);
Workaround: explicitly set the font size of the spans in the heading paragraphs foreach (Section section in this.radRichTextEditor1.Document.Sections) { foreach (Block block in section.Blocks) { Paragraph p = block as Paragraph; if (p != null && p.StyleName == "Heading1") { foreach (var item in p.Inlines) { Span s = item as Span; if (s!= null) { s.FontSize = p.FontSize; } } } } }