WPF-də yalnız sayısal məlumatları qəbul etmək üçün TextBox-un necə alınması lazımdır?

Mən nömrə və ondalık nöqtəni qəbul etmək istəyirəm, amma bir əlamət yoxdur.

Windows Forms üçün NumericUpDown denetimini və Microsoft'un NumericUpDown user nəzarətinin bu nümunəsini istifadə edərək nümunələrə baxdım. Amma hələ ki, NumericUpDown (WPF tərəfindən dəstəklənir və ya deyil) mən istədiyim funksionallığı təmin etmək fikrində deyil görünür. Mənim müraciətim təşkil edildikdə, onların sağ ağılında oxları oxumaq istəyərdi. Mənim müraciətlərimin kontekstində praktiki məna yoxdur.

Buna görə, mən lazım olan simvolları qəbul etmək üçün standart WPF TextBox əldə etmək üçün asan bir yol axtarıram. Mümkündürmü? Praktik mi?

290
12 авг. Giffyguy tərəfindən 12 Avqustda təyin olundu 2009-08-12 23:31 '09 at 11:31 PM 2009-08-12 23:31
@ 28 cavab

Mətn daxilində önizləmə əlavə edin. <TextBox PreviewTextInput="PreviewTextInput"/> bu kimi: <TextBox PreviewTextInput="PreviewTextInput"/> .

Bunun içərisində mətnə ​​icazə verilmədiyi təqdirdə e.Handled . e.Handled = !IsTextAllowed(e.Text);

IsTextAllowed üsulunda sadə bir müntəzəm ifadə istifadə etdim ki, daxil olduqlarına icazə verməməlisən. Mənim vəziyyətimdə yalnız nömrələrə, dövrlərə və tirelərə icazə vermək istəyirəm.

 private static readonly Regex _regex = new Regex("[^0-9.-]+"); //regex that matches disallowed text private static bool IsTextAllowed(string text) { return !_regex.IsMatch(text); } 

Səhv məlumatların bir-birinə yapışmasını qarşısını almaq istəyirsinizsə DataObject.Pasting="TextBoxPasting" hadisələrini DataObject.Pasting="TextBoxPasting" burada göstərildiyi kimi DataObject.Pasting="TextBoxPasting" (kod çıxarışı):

 // Use the DataObject.Pasting Handler private void TextBoxPasting(object sender, DataObjectPastingEventArgs e) { if (e.DataObject.GetDataPresent(typeof(String))) { String text = (String)e.DataObject.GetData(typeof(String)); if (!IsTextAllowed(text)) { e.CancelCommand(); } } else { e.CancelCommand(); } } 
362
12 авг. Cavab Ray 12 avqustda verilir. 2009-08-12 23:46 '09 at 11:46 'da 2009-08-12 23:46

Tədbir işləyicisi mətn daxil önizlemesini həyata keçirir. Burada, müntəzəm ifadə yalnız mətn daxiletməsi ilə uyğun gəlir və sonra mətn daxilində daxil edilmir.

Yalnız məktublara ehtiyacınız varsa, [^a-zA-Z] ilə müntəzəm ifadəni əvəz edin.

XAML

border=0
 using System.Text.RegularExpressions; private void NumberValidationTextBox(object sender, TextCompositionEventArgs e) { Regex regex = new Regex("[^0-9]+"); e.Handled = regex.IsMatch(e.Text); } 
156
04 окт. cavab Kişor 04 oktyabrdır. 2012-10-04 09:42 '12 at 9:42 2012-10-04 09:42

Mən artıq orada olan bəzi şeylərdən istifadə etdim və məncə, bu kodu çoxluq fikirləri ilə yayılamamaq üçün davranışımdan istifadə edərək, mənim özümə əlavə etdi ...

 public class AllowableCharactersTextBoxBehavior : Behavior<TextBox> { public static readonly DependencyProperty RegularExpressionProperty = DependencyProperty.Register("RegularExpression", typeof(string), typeof(AllowableCharactersTextBoxBehavior), new FrameworkPropertyMetadata(".*")); public string RegularExpression { get { return (string)base.GetValue(RegularExpressionProperty); } set { base.SetValue(RegularExpressionProperty, value); } } public static readonly DependencyProperty MaxLengthProperty = DependencyProperty.Register("MaxLength", typeof(int), typeof(AllowableCharactersTextBoxBehavior), new FrameworkPropertyMetadata(int.MinValue)); public int MaxLength { get { return (int)base.GetValue(MaxLengthProperty); } set { base.SetValue(MaxLengthProperty, value); } } protected override void OnAttached() { base.OnAttached(); AssociatedObject.PreviewTextInput += OnPreviewTextInput; DataObject.AddPastingHandler(AssociatedObject, OnPaste); } private void OnPaste(object sender, DataObjectPastingEventArgs e) { if (e.DataObject.GetDataPresent(DataFormats.Text)) { string text = Convert.ToString(e.DataObject.GetData(DataFormats.Text)); if (!IsValid(text, true)) { e.CancelCommand(); } } else { e.CancelCommand(); } } void OnPreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e) { e.Handled = !IsValid(e.Text, false); } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.PreviewTextInput -= OnPreviewTextInput; DataObject.RemovePastingHandler(AssociatedObject, OnPaste); } private bool IsValid(string newText, bool paste) { return !ExceedsMaxLength(newText, paste)  Regex.IsMatch(newText, RegularExpression); } private bool ExceedsMaxLength(string newText, bool paste) { if (MaxLength == 0) return false; return LengthOfModifiedText(newText, paste) > MaxLength; } private int LengthOfModifiedText(string newText, bool paste) { var countOfSelectedChars = this.AssociatedObject.SelectedText.Length; var caretIndex = this.AssociatedObject.CaretIndex; string text = this.AssociatedObject.Text; if (countOfSelectedChars > 0 || paste) { text = text.Remove(caretIndex, countOfSelectedChars); return text.Length + newText.Length; } else { var insert = Keyboard.IsKeyToggled(Key.Insert); return insert  caretIndex < text.Length ? text.Length : text.Length + newText.Length; } } } 

İşdə müvafiq təqdimat kodu:

 <TextBox MaxLength="50" TextWrapping="Wrap" MaxWidth="150" Margin="4" Text="{Binding Path=FileNameToPublish}" > <interactivity:Interaction.Behaviors> <v:AllowableCharactersTextBoxBehavior RegularExpression="^[0-9.\-]+$" MaxLength="50" /> </interactivity:Interaction.Behaviors> </TextBox> 
76
04 нояб. Cavab Wil P 04 noyabr tarixində verilir. 2011-11-04 23:41 '11 at 11:41 pm 2011-11-04 23:41

Bu inkişaf etmiş bir WilP cavab həllidir . Mənim təkmilləşdirmələrim:

  • Təkmilləşdirilmiş Del və Backspace Button Davranışı
  • Boş simli sığmayan halda EmptyValue xüsusiyyətini əlavə etdi
  • Bəzi kiçik yazı tiplərini düzəltdilər.
55
18 июля '13 в 8:44 2013-07-18 08:44 Cavab Alex Klaus tərəfindən 18 iyul '13 'də saat 08:44' də verildi 2013-07-18 08:44

MƏQSƏDİ dəyişərkən məlumatların sayısal olub-olmadığını müəyyən etmək üçün yoxlanılır və əgər varsa, işləməyə davam etməyə imkan verir və əgər istifadəçi yalnız bu sahədə nümunəvi məlumatları qəbul etməyə çağırır.

Windows Təqdimat Vəqfində doğrulama ilə daha çox oxuyun

22
12 авг. Stephen Wrighton tərəfindən verilmiş cavab 12 Avqust 2009-08-12 23:35 '09 at 23:35 'da 2009-08-12 23:35

WPF Genişləndirilmiş Toolkit bir var: NumericUpDown 2019

21
17 марта '11 в 6:25 2011-03-17 06:25 Cavab Brian Lagunas tərəfindən 17 Mart 'da 6:25' də verildi 2011-03-17 06:25

MVVM ilə bunu etmək üçün çox sadə və asan bir yoldur.

TextBox'u görünüş modelindəki tamsayı əmlakla əlaqələndirin və bir daş kimi işləyəcək ... mətn sahəsində qeyri-tam ədəd daxil edildikdə hətta bir çek göstərəcəkdir.

XAML kodu:

 <TextBox x:Name="contactNoTxtBox" Text="{Binding contactNo}" /> 

Model kodunu bax:

20
16 июня '17 в 13:17 2017-06-16 13:17 Cavab Snziv Gupta tərəfindən 16 iyun '17 'də 13:17 2017-06-16 13:17' də verilir

Bir validasiya qaydasını sadəcə həyata keçirə və TextBox-a tətbiq edə bilərsiniz:

  <TextBox> <TextBox.Text> <Binding Path="OnyDigitInput" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <conv:OnlyDigitsValidationRule /> </Binding.ValidationRules> </Binding> </TextBox.Text> 

Qaydaya aşağıdakı şəkildə riayət etməklə (digər cavablarda təklif olunan eyni Regex istifadə):

 public class OnlyDigitsValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var validationResult = new ValidationResult(true, null); if(value != null) { if (!string.IsNullOrEmpty(value.ToString())) { var regex = new Regex("[^0-9.-]+"); //regex that matches disallowed text var parsingOk = !regex.IsMatch(value.ToString()); if (!parsingOk) { validationResult = new ValidationResult(false, "Illegal Characters, Please Enter Numeric Value"); } } } return validationResult; } } 
16
01 сент. cavab goul verilir 01 Sep 2016-09-01 11:51 '16 'da 11:51 2016-09-01 11:51

Klaviaturanın ədədi nömrələrinə və arxa boşluqlara icazə verdim:

  private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { int key = (int)e.Key; e.Handled = !(key >= 34  key <= 43 || key >= 74  key <= 83 || key == 2); } 
8
17 июля '13 в 0:12 2013-07-17 00:12 Cavab 17 İyul 2013 günü 0:12 2013-07-17 00:12 Hamzeh Soboh tərəfindən verilir

Burada mən Ray cavabından ilhamlanan sadə bir həll var. Hər hansı bir ədədi müəyyən etmək kifayətdir.

Yalnızca müsbət ədədlər, tam dəyərlər və ya maksimum decimal ədədlərin düzgünlüyünə və ya dəyərlərə ehtiyac olduqda bu həlli asanlıqla dəyişə bilər.


PreviewTextInput cavabı olaraq bildirildiyinə görə, əvvəlcə PreviewTextInput hadisə əlavə PreviewTextInput :

 <TextBox PreviewTextInput="TextBox_OnPreviewTextInput"/> 

Sonra aşağıdakıları kod qoyun:

7
03 янв. Cavab Anthony Jan 03 tərəfindən verilir 2018-01-03 21:16 '18 at 21:16 2018-01-03 21:16

Hesab edirəm ki,

  1. Yalnızca rəqəmli girişə icazə vermək istədiyiniz TextBox, əvvəlcə bəzi etibarlı ədədi dəyərinə (məsələn, 2.7172) müəyyən edilmiş Text xüsusiyyətinə malikdir.

  2. Sizin mətn qutusu ana pəncərənizin bir uşağıdır.

  3. Ana pencereniz Window1dir

  4. Mətn qutusundakı adınız sayısaldır

Əsas fikir:

  1. private string previousText; əlavə edin private string previousText; ana pəncərə sinifinə (Window1)

  2. Əlavə: previousText = numericTB.Text; ana pəncərə dizayneri üçün

  3. NumericTB.TextChanged hadisə üçün bir işleyici yaradın ki, belə bir şey belə görünür:

     private void numericTB_TextChanged(object sender, TextChangedEventArgs e) { double num = 0; bool success = double.TryParse(((TextBox)sender).Text, out num); if (success  num >= 0) previousText = ((TextBox)sender).Text; else ((TextBox)sender).Text = previousText; } 

Bu halda, əvvəlki etiket, numericTB.Text, etibarlı olduğu müddətdə və numericTB.Text istifadəçi istəməyən bir şey yazarsa, son etibarlı dəyərinə təyin ediləcəkdir. Əlbəttə ki, bu, sadəcə, əsas fikirdir və sadəcə "əjdahalara qarşı davamlıdır" və "ağılsızlardan qorunmur". Məsələn, istifadəçi boşluqlarla qarışdıqda vəziyyətə toxunmur. Beləliklə, burada "məntiqi sübut" hesab edirəm, əgər səhv etsəm, mənə deyin:

  1. Window1.xaml dosyanızın məzmunu:

     <Window x:Class="IdiotProofNumericTextBox.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <TextBox Height="30" Width="100" Name="numericTB" TextChanged="numericTB_TextChanged"/> </Grid> </Window> 
  2. Window.xaml.cs faylının məzmunu:

     using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace IdiotProofNumericTextBox { public partial class Window1 : Window { private string previousText; public Window1() { InitializeComponent(); previousText = numericTB.Text; } private void numericTB_TextChanged(object sender, TextChangedEventArgs e) { if (string.IsNullOrEmpty(((TextBox)sender).Text)) previousText = ""; else { double num = 0; bool success = double.TryParse(((TextBox)sender).Text, out num); if (success  num >= 0) { ((TextBox)sender).Text.Trim(); previousText = ((TextBox)sender).Text; } else { ((TextBox)sender).Text = previousText; ((TextBox)sender).SelectionStart = ((TextBox)sender).Text.Length; } } } } } 

Və bu budur. TextBoxes bir çox varsa, mən əvvəlki Text və numericTB_TextChanged wrap ayrı bir fayl daxil edə bilərsiniz ki, TextBox dən devralır bir CustomControl yaratmaq gəlir.

7
18 марта '11 в 22:46 2011-03-18 22:46 cavab 18 mart 2011-ci il saat 11: 46-da user666535 tərəfindən verilmişdir. 2011-03-18 22:46

Əsas funksiyanı yerinə yetirmək üçün bir çox kod yazmaq istəmirsinizsə (insanların uzun metodlardan nə üçün istifadə etdiyini bilmirəm) bunu sadəcə edə bilərsiniz:

  1. Ad adını əlavə edin:

     private void txt1_TextChanged(object sender, TextChangedEventArgs e) { txt1.Text = Regex.Replace(txt1.Text, "[^0-9]+", ""); } 
6
30 мая '17 в 18:42 2017-05-30 18:42 Cavab iato tərəfindən 30 May '18 ' də 18:42 2017-05-30 18:42 'də verilir

Lazım olan yeganə kod:

 void MyTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = new Regex("[^0-9]+").IsMatch(e.Text); } 

Bu sayları yalnız mətn qutusuna daxil etməyə imkan verir.

Ondalık nöqtəni və ya eksi işarəsini aradan qaldırmaq üçün, normal ifadəni [^0-9.-]+ dəyişə bilərsiniz.

5
15 февр. Cavab Danny Beckett tərəfindən 15 Fevralda verilir. 2014-02-15 02:17 '14 da 2:17 2014-02-15 02:17
 PreviewTextInput += (s, e) => { e.Handled = !e.Text.All(char.IsDigit); }; 
4
11 авг. Julian Kowalczuk tərəfindən verilmiş cavabı 11 av . 2017-08-11 13:09 '17 saat 13:09 'da 2017-08-11 13:09
 e.Handled = (int)e.Key >= 43 || (int)e.Key <= 34; 

mətn qutusundakı önizleme hadisəsində.

3
15 апр. Cavab aprelin 15-də verilir. 2011-04-15 14:08 '11 at 14:08 2011-04-15 14:08

Bir dəyişiklik mətn sahəsi ilə yoxlaya bilərik. Aşağıdakı tətbiq girişin sayısal və bir decimal nöqtəsindən başqa girməsini maneə törədir.

 private void textBoxNumeric_TextChanged(object sender, TextChangedEventArgs e) { TextBox textBox = sender as TextBox; Int32 selectionStart = textBox.SelectionStart; Int32 selectionLength = textBox.SelectionLength; String newText = String.Empty; int count = 0; foreach (Char c in textBox.Text.ToCharArray()) { if (Char.IsDigit(c) || Char.IsControl(c) || (c == '.'  count == 0)) { newText += c; if (c == '.') count += 1; } } textBox.Text = newText; textBox.SelectionStart = selectionStart <= textBox.Text.Length ? selectionStart : textBox.Text.Length; } 
3
04 июня '12 в 17:16 2012-06-04 17:16 cavab 04 iyun '12 'də saat 17.16' da Qumar Qouraw tərəfindən verilir. 2012-06-04 17:16

Başqa bir yanaşma əlavə davranışlardan istifadə etməkdir, mənim layihəim boyunca mətn sahələrində istifadə oluna bilən öz TextBoxHelper sinifini tətbiq etdim. Çünki düşündüm ki, hər bir mətn sahəsi üçün və hər bir XAML faylında hadisələrə abunə olma bu məqsədlə çox vaxt ala bilər.

Uygulandığım TextBoxHelper sınıfı aşağıdakı xüsusiyyətlərə malikdir:

  • Yalnız Double , Int , UintTəbii nömrələri süzün və qəbul edin
  • Süzün və tək və ya tək ədədləri qəbul edin
  • Nümerik mətn sahələrində etibarsız mətnin yerləşdirilməsini maneə törətmək üçün bir hadisə işləyicisinin yerləşdirilməsini idarə edin .
  • Mətn sahələri üçün TextChanged hadisəsinə abunə edərək son əlamət kimi etibarsız məlumatların qarşısını almaq üçün istifadə ediləcək olan u mənim dəyərini təyin edə bilərsiniz.

Burada TextBoxHelper sinifinin tətbiqi:

 public static class TextBoxHelper { #region Enum Declarations public enum NumericFormat { Double, Int, Uint, Natural } public enum EvenOddConstraint { All, OnlyEven, OnlyOdd } #endregion #region Dependency Properties  CLR Wrappers public static readonly DependencyProperty OnlyNumericProperty = DependencyProperty.RegisterAttached("OnlyNumeric", typeof(NumericFormat?), typeof(TextBoxHelper), new PropertyMetadata(null, DependencyPropertiesChanged)); public static void SetOnlyNumeric(TextBox element, NumericFormat value) => element.SetValue(OnlyNumericProperty, value); public static NumericFormat GetOnlyNumeric(TextBox element) => (NumericFormat) element.GetValue(OnlyNumericProperty); public static readonly DependencyProperty DefaultValueProperty = DependencyProperty.RegisterAttached("DefaultValue", typeof(string), typeof(TextBoxHelper), new PropertyMetadata(null, DependencyPropertiesChanged)); public static void SetDefaultValue(TextBox element, string value) => element.SetValue(DefaultValueProperty, value); public static string GetDefaultValue(TextBox element) => (string) element.GetValue(DefaultValueProperty); public static readonly DependencyProperty EvenOddConstraintProperty = DependencyProperty.RegisterAttached("EvenOddConstraint", typeof(EvenOddConstraint), typeof(TextBoxHelper), new PropertyMetadata(EvenOddConstraint.All, DependencyPropertiesChanged)); public static void SetEvenOddConstraint(TextBox element, EvenOddConstraint value) => element.SetValue(EvenOddConstraintProperty, value); public static EvenOddConstraint GetEvenOddConstraint(TextBox element) => (EvenOddConstraint)element.GetValue(EvenOddConstraintProperty); #endregion #region Dependency Properties Methods private static void DependencyPropertiesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (!(d is TextBox textBox)) throw new Exception("Attached property must be used with TextBox."); switch (e.Property.Name) { case "OnlyNumeric": { var castedValue = (NumericFormat?) e.NewValue; if (castedValue.HasValue) { textBox.PreviewTextInput += TextBox_PreviewTextInput; DataObject.AddPastingHandler(textBox, TextBox_PasteEventHandler); } else { textBox.PreviewTextInput -= TextBox_PreviewTextInput; DataObject.RemovePastingHandler(textBox, TextBox_PasteEventHandler); } break; } case "DefaultValue": { var castedValue = (string) e.NewValue; if (castedValue != null) { textBox.TextChanged += TextBox_TextChanged; } else { textBox.TextChanged -= TextBox_TextChanged; } break; } } } #endregion private static void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { var textBox = (TextBox)sender; string newText; if (textBox.SelectionLength == 0) { newText = textBox.Text.Insert(textBox.SelectionStart, e.Text); } else { var textAfterDelete = textBox.Text.Remove(textBox.SelectionStart, textBox.SelectionLength); newText = textAfterDelete.Insert(textBox.SelectionStart, e.Text); } var evenOddConstraint = GetEvenOddConstraint(textBox); switch (GetOnlyNumeric(textBox)) { case NumericFormat.Double: { if (double.TryParse(newText, out double number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.Handled = true; else e.Handled = false; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.Handled = true; else e.Handled = false; break; } } else e.Handled = true; break; } case NumericFormat.Int: { if (int.TryParse(newText, out int number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.Handled = true; else e.Handled = false; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.Handled = true; else e.Handled = false; break; } } else e.Handled = true; break; } case NumericFormat.Uint: { if (uint.TryParse(newText, out uint number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.Handled = true; else e.Handled = false; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.Handled = true; else e.Handled = false; break; } } else e.Handled = true; break; } case NumericFormat.Natural: { if (uint.TryParse(newText, out uint number)) { if (number == 0) e.Handled = true; else { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.Handled = true; else e.Handled = false; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.Handled = true; else e.Handled = false; break; } } } else e.Handled = true; break; } } } private static void TextBox_PasteEventHandler(object sender, DataObjectPastingEventArgs e) { var textBox = (TextBox)sender; if (e.DataObject.GetDataPresent(typeof(string))) { var clipboardText = (string) e.DataObject.GetData(typeof(string)); var newText = textBox.Text.Insert(textBox.SelectionStart, clipboardText); var evenOddConstraint = GetEvenOddConstraint(textBox); switch (GetOnlyNumeric(textBox)) { case NumericFormat.Double: { if (double.TryParse(newText, out double number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.CancelCommand(); break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.CancelCommand(); break; } } else e.CancelCommand(); break; } case NumericFormat.Int: { if (int.TryParse(newText, out int number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.CancelCommand(); break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.CancelCommand(); break; } } else e.CancelCommand(); break; } case NumericFormat.Uint: { if (uint.TryParse(newText, out uint number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.CancelCommand(); break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.CancelCommand(); break; } } else e.CancelCommand(); break; } case NumericFormat.Natural: { if (uint.TryParse(newText, out uint number)) { if (number == 0) e.CancelCommand(); else { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) e.CancelCommand(); break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) e.CancelCommand(); break; } } } else { e.CancelCommand(); } break; } } } else { e.CancelCommand(); } } private static void TextBox_TextChanged(object sender, TextChangedEventArgs e) { var textBox = (TextBox)sender; var defaultValue = GetDefaultValue(textBox); var evenOddConstraint = GetEvenOddConstraint(textBox); switch (GetOnlyNumeric(textBox)) { case NumericFormat.Double: { if (double.TryParse(textBox.Text, out double number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) textBox.Text = defaultValue; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) textBox.Text = defaultValue; break; } } else textBox.Text = defaultValue; break; } case NumericFormat.Int: { if (int.TryParse(textBox.Text, out int number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) textBox.Text = defaultValue; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) textBox.Text = defaultValue; break; } } else textBox.Text = defaultValue; break; } case NumericFormat.Uint: { if (uint.TryParse(textBox.Text, out uint number)) { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) textBox.Text = defaultValue; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) textBox.Text = defaultValue; break; } } else textBox.Text = defaultValue; break; } case NumericFormat.Natural: { if (uint.TryParse(textBox.Text, out uint number)) { if(number == 0) textBox.Text = defaultValue; else { switch (evenOddConstraint) { case EvenOddConstraint.OnlyEven: if (number % 2 != 0) textBox.Text = defaultValue; break; case EvenOddConstraint.OnlyOdd: if (number % 2 == 0) textBox.Text = defaultValue; break; } } } else { textBox.Text = defaultValue; } break; } } } } 

Və burada asan istifadə bəzi nümunələri:

 <TextBox viewHelpers:TextBoxHelper.OnlyNumeric="Double" viewHelpers:TextBoxHelper.DefaultValue="1"/> 

Və ya

 <TextBox viewHelpers:TextBoxHelper.OnlyNumeric="Natural" viewHelpers:TextBoxHelper.DefaultValue="3" viewHelpers:TextBoxHelper.EvenOddConstraint="OnlyOdd"/> 

Обратите внимание, что мой TextBoxHelper находится в псевдониме viewHelpers xmlns.