//https://stackoverflow.com/questions/35324285/how-to-create-masked-textbox-like-windows-ip-address-fields using System; using System.Collections.Generic; using System.IO; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace DTS.Common.Controls { /// /// Interaction logic for IPTextBox.xaml /// public partial class TestIDTextBox : UserControl { private static readonly List OtherAllowedKeys = new List { Key.Delete }; private bool _suppressAddressUpdate = false; public TestIDTextBox() { InitializeComponent(); } //FB 43400 added Clear method to reset the segments public void Clear() { tbTestId.Text = string.Empty; } public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof(string), typeof(TestIDTextBox), new FrameworkPropertyMetadata(default(string), TextChanged) { BindsTwoWayByDefault = true }); private static void TextChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { var tb = dependencyObject as TestIDTextBox; var text = e.NewValue as string; if (text != null && tb != null) { tb._suppressAddressUpdate = true; if (IsValidText(text)) { tb.tbTestId.Text = text; } else { tb.tbTestId.Text = (string)e.OldValue; } tb._suppressAddressUpdate = false; } } public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } private static bool IsValidText(string text) { var invalidChars = new List(); invalidChars.AddRange(Path.GetInvalidFileNameChars()); invalidChars.AddRange(Path.GetInvalidPathChars()); invalidChars.Add('.'); var charArray = text.ToCharArray(); return !Array.Exists(charArray, x => invalidChars.Contains(x)); } private void tbTestId_PreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = !IsValidText(e.Text); } private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e) { if ( !(sender is TextBox tb)) { return; } e.Handled = !IsValidText(tb.Text); } } }