/// <summary> /// Event handler for Textbox on preview text. Called before displaying the entered text. /// </summary> /// <param name="e"></param> protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e) { if (IsReadOnly) { base.OnPreviewTextInput(e); return; } if (Mask != null) { if (IsValid(e.Text)) { int position = SelectionStart; MaskTextFormatter maskProvider = MaskProvider; if (position < maskProvider.Capacity) { position = maskProvider.InsertAt(e.Text, position); } RefreshText(maskProvider, position); } e.Handled = true; } base.OnPreviewTextInput(e); }
/// <summary> /// Use the mask to generate a new display string. /// </summary> /// <param name="maskProvider"></param> /// <param name="position"></param> private void RefreshText(MaskTextFormatter maskProvider, int position) { // Refresh string. this.Text = maskProvider.ToString(); // Position cursor. this.SelectionStart = position; }
/// <summary> /// Handler for special keys like delete. /// </summary> /// <param name="e"></param> protected override void OnPreviewKeyDown(KeyEventArgs e) { base.OnPreviewKeyDown(e); MaskTextFormatter maskProvider = MaskProvider; int position = SelectionStart; int length = SelectionLength; bool refresh = false; if (e.Key == Key.Delete && position < Text.Length) { if (length > 0) { refresh = maskProvider.Remove(position, length); } else { refresh = maskProvider.Remove(position); } e.Handled = true; } else if (e.Key == Key.Back) { if (length > 0) { refresh = maskProvider.Remove(position, length); } else { if (position > 0) { position--; refresh = maskProvider.Remove(position); } } e.Handled = true; } else if (e.Key == Key.Escape) { this.maskTextFormatter.Set(((MaskTextBox)e.OriginalSource).Text); } if (refresh == true) { RefreshText(maskProvider, position); } }
/// <summary> ///Force the text of the control to use the mask /// </summary> /// <param name="sender"></param> /// <param name="value"></param> /// <returns></returns> private static object ForceText(DependencyObject sender, object value) { MaskTextBox textBox = (MaskTextBox)sender; if (textBox.Mask != null && value != null) { MaskTextFormatter provider = new MaskTextFormatter(textBox.Mask); provider.Validate += delegate(char character) { return(textBox.IsValid(character)); }; provider.Set((string)value); return(provider.ToString()); } else { return(value); } }