Currently all spell checker dialogs are not accessible for customization.
example: Imports Telerik.WinControls.UI Imports Telerik.WinControls.RichTextBox.Proofing Imports System.IO Imports System.Globalization Public Class Form1 Dim radTextBox1 As RadTextBox = New RadTextBox Dim radSpellChecker1 As RadSpellChecker = New RadSpellChecker Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load radTextBox1.Parent = Me.Panel1 radTextBox1.Multiline = True radTextBox1.Dock = DockStyle.Fill radSpellChecker1.SpellCheckMode = SpellCheckMode.WordByWord Dim textBoxControlSpellChecker As IControlSpellChecker = Me.radSpellChecker1.GetControlSpellChecker(GetType(RadTextBox)) Dim documentSpellChecker As DocumentSpellChecker = TryCast(textBoxControlSpellChecker.SpellChecker, DocumentSpellChecker) Dim ms As New MemoryStream(My.Resources.sv_SE ) Dim dictionary As New WordDictionary() dictionary.Load(ms) documentSpellChecker.AddDictionary(dictionary, CultureInfo.CurrentCulture) radSpellChecker1.SpellCheckMode = SpellCheckMode.AllAtOnce End Sub Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click Me.radSpellChecker1.Check(Me.radTextBox1) End Sub End Class
first digit entered 3 would display 0.03 second digit 5 entered would display 0.35 third digit 0 entered would display 3.50
The RadDateTimeEditor does not obey MaxDate and MinDate property when the value is changed by keyboard input. Work around: public class MyRadDateTimeEditor : RadDateTimeEditor { public MyRadDateTimeEditor() { RadDateTimeEditorElement element = this.EditorElement as RadDateTimeEditorElement; element.CurrentBehavior.TextBoxElement.ValueChanged += this.OnValueChanged; } private void OnValueChanged(object sender, System.EventArgs e) { RadMaskedEditBoxElement maskBox = sender as RadMaskedEditBoxElement; RadDateTimeEditorElement element = this.EditorElement as RadDateTimeEditorElement; DateTime result; if (maskBox.Value != null && DateTime.TryParse(maskBox.Value.ToString(), out result) && DateTime.Compare(result, element.MaxDate) > 0) { this.Value = element.MaxDate; maskBox.Value = element.MaxDate; return; } } }
Workaround: Users should use a N0 mask instead of G mask.
The sender of the KeyPress event should be RadMaskedEditBox. Currently, it is RadMaskedEditBoxElement.
1. Create a new application with RadMarkupDialog. 2. Use the ILMerge tool to merge all assemblies in one executable file. 3. Run that file. You will see that all images are missing.
Currently it is not possible to represent time as 24:00 in time picker control as it uses the .NET DateType type, which does not support "24:00" as valid time.
RadTimePicker/RadTimePickerElement should display empty text or Null text if the Value property is set to null. Workaround: Me.RadTimePicker1.NullText = "Please, enter a time!" Me.RadTimePicker1.Value = Nothing Me.RadTimePicker1.TimePickerElement.MaskedEditBox.TextBoxItem.Text = ""
If you set MaskType to Standard and Mask to ">LLL_LLL_LLL" and set the TextMaskFormat property to ExcludePromptAndLiterals, the result value property will be an empty string.
IF you canceling the textChanging event of the RadTextBox (e.Cancel = true) the cursor back at the start of the text. Work around: 1. Create custom text box element that inherited the RadTextBoxElement. For example: public class MyTextBoxElement : RadTextBoxElement { private bool isValueChanging = false; private int selectionStart = -1; public MyTextBoxElement() { this.TextBoxItem.HostedControl.TextChanged += new EventHandler(HostedControl_TextChanged); } protected override void OnTextChanging(Telerik.WinControls.TextChangingEventArgs e) { base.OnTextChanging(e); Regex regEx = new Regex(@"[\s]{1,}"); if (regEx.IsMatch(e.NewValue)) { isValueChanging = true; this.selectionStart = base.TextBoxItem.SelectionStart - 1; } } private void HostedControl_TextChanged(object sender, EventArgs e) { if (this.isValueChanging && selectionStart >= 0) { this.isValueChanging = false; this.TextBoxItem.SelectionStart = this.selectionStart; } } protected override Type ThemeEffectiveType { get { return typeof(RadTextBoxElement); } } } 2. Create custom Text box that inherited the RadTextBox: For Example: public class MyTextBox : RadTextBox { private static readonly FieldInfo TextBoxElementFieldInfo = typeof(RadTextBox).GetField("textBoxElement", BindingFlags.NonPublic | BindingFlags.Instance); public MyTextBox() { this.ThemeClassName = typeof(RadTextBox).FullName; } protected RadTextBoxElement TextBox { get { return (RadTextBoxElement)TextBoxElementFieldInfo.GetValue(this); } set { TextBoxElementFieldInfo.SetValue(this, value); } } protected override void InitializeTextElement() { this.TextBox = new MyTextBoxElement(); this.TextBox.StretchVertically = true; this.TextBox.ShowBorder = true; } } 3. Use your custom Text box instead the default RadTextBox. 4. Subscribe to text Changing event of the custom text box and add the following code snippet: Regex regEx = new Regex(@"[\s]{1,}"); if (regEx.IsMatch(e.NewValue)) { e.Cancel = true; }
Improve the RadTextBoxControl to allow different text alignment as Microsoft TextBox.
[C#] [Export(typeof(IControlSpellChecker))] class MyTextBoxControlSpellChecker : ControlSpellCheckerBase { #region Constants private static readonly char[] WordPartSeparators = new char[] { '-', '–', '’', '\\', '/', '|', '=', '*', '(', ')' }; #endregion #region Fields private RadTextBoxControl textBox; #endregion #region Constructors public MyTextBoxControlSpellChecker() { } #endregion #region Properties public override Control CurrentControl { get { return this.textBox; } set { this.textBox = (RadTextBoxControl)value; } } #endregion #region Methods public override void ChangeCurrentWord(string suggestion) { int selectionStartPosition = textBox.SelectionStart; int selectionLength = textBox.SelectionLength; StringBuilder textBoxText = new StringBuilder(this.textBox.Text); textBoxText.Remove(selectionStartPosition, selectionLength); textBoxText.Insert(selectionStartPosition, suggestion); textBox.Text = textBoxText.ToString(); } public override IWordInfo MoveToNextError() { foreach (TextBoxWordInfo wordInfo in this.GetListOfWords()) { if (!this.CheckWordIsCorrect(wordInfo.Word)) { this.textBox.SelectionStart = wordInfo.StartPosition; this.textBox.SelectionLength = wordInfo.Word.Length; this.textBox.Focus(); return wordInfo; } } return null; } private IEnumerable<IWordInfo> GetListOfWords() { foreach (var wordItem in this.GetWordsFromText(this.textBox.Text)) { if (wordItem.Word == " " || wordItem.Word == Environment.NewLine || wordItem.Word == "\r" || wordItem.IsUppercase || wordItem.ContainsDigits) { continue; } int partIndex = 0; int startIndex = wordItem.IndexInText; foreach (string word in wordItem.Word.Split(WordPartSeparators, StringSplitOptions.None)) { string trimmedWord = TrimWordEnd(word); startIndex += TrimWordStart(ref trimmedWord); var wordInfo = new TextBoxWordInfo(trimmedWord, startIndex); if (trimmedWord.Length > 1) { yield return wordInfo; } startIndex += word.Length; startIndex++;//+1 for the separator partIndex++; } } } private IEnumerable<WordItem> GetWordsFromText(string text) { bool wordContainsDigits = false; List<WordItem> words = new List<WordItem>(text.Length / 7); StringBuilder currentWord = new StringBuilder(); bool onlyUpperLetters = true; int i = 0; for (i = 0; i < text.Length; i++) { if (text[i] == Environment.NewLine[0]) { if (currentWord.Length > 0) { words.Add(new WordItem(currentWord.ToString(), i - currentWord.Length, wordContainsDigits, onlyUpperLetters)); currentWord.Clear(); } words.Add(new WordItem(Environment.NewLine, i - currentWord.Length, wordContainsDigits, onlyUpperLetters)); if (i + 1 < text.Length && text[i + 1] == Environment.NewLine[1]) { i++; } wordContainsDigits = false; onlyUpperLetters = true; } else if (text[i] != '\'' && (text[i].ToString() == " " || text[i].ToString() == "\t" || Char.IsPunctuation(text[i]))) { if (currentWord.Length > 0) { words.Add(new WordItem(currentWord.ToString(), i - currentWord.Length, wordContainsDigits, onlyUpperLetters)); currentWord.Clear(); } words.Add(new WordItem(text[i].ToString(), i - currentWord.Length, wordContainsDigits, onlyUpperLetters)); wordContainsDigits = false; onlyUpperLetters = true; } else { char nextChar = text[i]; if (nextChar > '0' && nextChar < '9') { wordContainsDigits = true; } onlyUpperLetters = onlyUpperLetters && !char.IsLower(nextChar); currentWord.Append(text[i]); } } if (currentWord.Length > 0) { words.Add(new WordItem(currentWord.ToString(), i - currentWord.Length, wordContainsDigits, onlyUpperLetters)); } return words; } private int TrimWordStart(ref string word) { int index = 0; while (index < word.Length && !char.IsLetter(word[index])) { index++; } if (index == 0) { return index; } if (index < word.Length) { word = word.Substring(index); } else { word = string.Empty; } return index; } private string TrimWordEnd(string word) { int index = word.Length - 1; while (index >= 0 && !char.IsLetter(word[index])) { index--; } if (index >= 0) { return word.Substring(0, index + 1); } return string.Empty; } private bool CheckWordIsCorrect(string word) { //TODO: add built-in dictionary, to allow suggestions for these words if (string.CompareOrdinal(word, "Telerik") == 0 || string.CompareOrdinal(word, "Microsoft") == 0 || string.CompareOrdinal(word, "Silverlight") == 0 || string.CompareOrdinal(word, "RadRichTextBox") == 0 || string.CompareOrdinal(word, "RadControls") == 0) { return true; } if (this.IgnoredWords != null && this.IgnoredWords.ContainsWord(word)) { return true; } return base.SpellChecker.CheckWordIsCorrect(word); } public override RadDocument GetContentAsDocument() { TxtFormatProvider txtFormatProvider = new TxtFormatProvider(); RadDocument document = txtFormatProvider.Import(this.textBox.Text); return document; } public override void SetContentFromDocument(RadDocument document) { TxtFormatProvider txtFormatProvider = new TxtFormatProvider(); this.textBox.Text = txtFormatProvider.Export(document); } #endregion } internal struct WordItem { public string Word; public int IndexInText; public bool ContainsDigits; public bool IsUppercase; public WordItem(string word, int indexInText, bool containsDigits, bool isUppercase) { this.Word = word; this.IndexInText = indexInText; this.ContainsDigits = containsDigits; this.IsUppercase = isUppercase; } }
To reproduce: Add the following line of code: [C#] this.radSpellChecker1.SpellCheckMode = Telerik.WinControls.UI.SpellCheckMode.AllAtOnce; [VB.NET] Me.RadSpellChecker1.SpellCheckMode = Telerik.WinControls.UI.SpellCheckMode.AllAtOnce When you spell check RadRichTextBox and the spell check form is opened click the change button. You will notice that the word will not changed in the original RadRichTextBox. this.radSpellChecker1.RegisterControlSpellChecker(typeof(RadRichTextBox), new MyRichTextBoxSpellChecker()); this.radSpellChecker1.SpellCheckMode = SpellCheckMode.AllAtOnce; Workaround: class MyRichTextBoxSpellChecker : RadRichTextBoxSpellChecker { public override Telerik.WinControls.RichTextBox.Model.RadDocument GetContentAsDocument() { return (this.CurrentControl as RadRichTextBox).Document; } }
Currently there can only be one delimiter in the autocomplete box. Different users might be accustomed to using different delimiters, even one user using several delimiters.
Step to reproduce: 1. Create Windows Forms project with a form 2. Place RadDateTimePicker control on created form 3. Run application. It will display current date. 4. Click on dropdown arrow to open Calendar 5. Navigate to any month outside of the current date using navigation bar on top of the Calendar, but do NOT select any date 6. Close Calendar without selecting any date 7. Click on dropdown arrow to open Calendar again. Calendar will display current date, which is correct. 8. Now select any date in Calendar 9. Click on dropdown arrow to open Calendar again. 10. Navigate to any month outside of the selected date using navigation bar on top of the Calendar, but do NOT select any date 11. Close and reopen Calendar again. It will display month to which it was navigated in Step 10. Instead it suppose to display selected date
To reproduce: - set the Mask to P2 - set the MaskType to Numeric - set the control value to 0.024 The the control displays "2.4" instead of "2.4 %" WORKAROUND: Private Sub RadMaskedEditBox1_ValueChanged(sender As Object, e As EventArgs) Dim control As RadMaskedEditBox = DirectCast(sender, RadMaskedEditBox) RemoveHandler control.ValueChanged, AddressOf RadMaskedEditBox1_ValueChanged control.MaskedEditBoxElement.TextBoxItem.Text = control.MaskedEditBoxElement.Provider.ToString(False, True) AddHandler control.ValueChanged, AddressOf RadMaskedEditBox1_ValueChanged End Sub
To reproduce: - set the Mask to N2 - set the MaskType to Numeric - set the control value to 4.456789 The the control displays 4.456789 instead of 4.46 WORKAROUND: Private Sub RadMaskedEditBox1_ValueChanged(sender As Object, e As EventArgs) Dim control As RadMaskedEditBox = DirectCast(sender, RadMaskedEditBox) RemoveHandler control.ValueChanged, AddressOf RadMaskedEditBox1_ValueChanged control.MaskedEditBoxElement.TextBoxItem.Text = control.MaskedEditBoxElement.Provider.ToString(False, True) AddHandler control.ValueChanged, AddressOf RadMaskedEditBox1_ValueChanged End Sub
1. limitation of the time that can be chosen (e.g. 8 AM to 5 PM) 2. set the interval of increasing and decreasing the Minutes part to 30 instead of 1 NO WORKAROUND Resolution: In release Q2 2014 we are introducing logic that allow to set time range by MinValue and MaxValue properties of RadTimePicker. To set the interval of increasing and decreasing of the minute’s part you can use the MinutesStep property of the MaskDateTimeProvider. For example for RadTimePicker: (this.radTimePicker1.TimePickerElement.MaskedEditBox.Provider as MaskDateTimeProvider).MinutesStep = 30; For example for RadDateTimePicker: RadMaskedEditBoxElement mask = (RadMaskedEditBoxElement)this.radDateTimePicker1.DateTimePickerElement.TextBoxElement; MaskDateTimeProvider provider = mask.Provider as MaskDateTimeProvider; provider.MinutesStep = 30;
Symbol characters are process as mnemonics in RadAutoCompleteBox when Italian keyboard is used and non-modifier (Alt or Ctrl) keys are pressed.