private void OnTextBoxKeyDown(object sender, KeyEventArgs e) { _manualChange = _manualChange || e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Decimal || e.Key == Key.OemComma || e.Key == Key.OemPeriod; if (NumericInputMode.HasFlag(NumericInput.Decimal) && (e.Key == Key.Decimal || e.Key == Key.OemPeriod)) { TextBox textBox = sender as TextBox; if (textBox.Text.Contains(this.SpecificCultureInfo.NumberFormat.NumberDecimalSeparator) == false) { //the control doesn't contai the decimal separator //so we get the current caret index to insert the current culture decimal separator var caret = textBox.CaretIndex; //update the control text textBox.Text = textBox.Text.Insert(caret, this.SpecificCultureInfo.NumberFormat.CurrencyDecimalSeparator); //move the caret to the correct position textBox.CaretIndex = caret + 1; } e.Handled = true; } }
protected void OnPreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = true; if (string.IsNullOrWhiteSpace(e.Text) || e.Text.Length != 1) { return; } TextBox textBox = (TextBox)sender; CultureInfo equivalentCulture = SpecificCultureInfo; NumberFormatInfo numberFormatInfo = equivalentCulture.NumberFormat; string text = e.Text; if (char.IsDigit(text[0])) { if (textBox.Text.IndexOf(numberFormatInfo.NegativeSign, textBox.SelectionStart + textBox.SelectionLength, StrComp) < 0 && textBox.Text.IndexOf(numberFormatInfo.PositiveSign, textBox.SelectionStart + textBox.SelectionLength, StrComp) < 0) { e.Handled = false; } } else { bool allTextSelected = textBox.SelectedText == textBox.Text; if (numberFormatInfo.NumberDecimalSeparator == text) { if (textBox.Text.All(i => i.ToString(equivalentCulture) != numberFormatInfo.NumberDecimalSeparator) || allTextSelected) { if (NumericInputMode.HasFlag(NumericInput.Decimal)) { e.Handled = false; } } } else { if (numberFormatInfo.NegativeSign == text || text == numberFormatInfo.PositiveSign) { if (textBox.SelectionStart == 0) { // check if text already has a + or - sign if (textBox.Text.Length > 1) { if (allTextSelected || (!textBox.Text.StartsWith(numberFormatInfo.NegativeSign, StrComp) && !textBox.Text.StartsWith(numberFormatInfo.PositiveSign, StrComp))) { e.Handled = false; } } else { e.Handled = false; } } else if (textBox.SelectionStart > 0) { string elementBeforeCaret = textBox.Text.ElementAt(textBox.SelectionStart - 1).ToString(equivalentCulture); if (elementBeforeCaret.Equals(ScientificNotationChar, StrComp) && NumericInputMode.HasFlag(NumericInput.Decimal)) { e.Handled = false; } } } else if (text.Equals(ScientificNotationChar, StrComp) && NumericInputMode.HasFlag(NumericInput.Decimal) && textBox.SelectionStart > 0 && !textBox.Text.Any(i => i.ToString(equivalentCulture).Equals(ScientificNotationChar, StrComp))) { e.Handled = false; } } } this._manualChange = this._manualChange || !e.Handled; }