2017-03-01 3 views
0

Ich bin sehr neu in der Programmierung und mache es hauptsächlich als Hobby, aber ich habe ein paar kleine ausführbare Programme gemacht, die mir bei meiner Arbeit helfen (wenig branchenspezifisch RechnerTextfeld Inhalt string, aber nur Zahlen bei der Eingabe von Zeichen in Textfeld

Auf die Frage habe ich eine Textbox mit einem Inhalt vor dem Fokus, den ich behalten möchte, aber auch möchte ich nur Zahlen eingeben lassen, gibt es irgendeinen Weg dies zu tun.

+0

Sorry, sollte hinzugefügt haben, der Inhalt vor dem Fokus ist eine Zeichenfolge. –

+1

Mögliches Duplikat von [Wie erhalte ich eine TextBox, die nur numerische Eingaben in WPF akzeptiert?] (Http://stackoverflow.com/questions/1268552/how-do-i-get-a-textbox-to-only-accept -numeric-input-in-wpf) –

+0

Sie können versuchen, TextMode = "Number" in Ihr Textfeld-Steuerelement zu setzen. Sehen Sie, ob dieser für Sie arbeitet. Wenn nicht, müssen Sie einen Validator verwenden. – jmag

Antwort

1

Versuchen Hinzufügen PreviewTextInput Ereignishandler Ihre TextBox.

textBox1.PreviewTextInput += new TextCompositionEventHandler(textBox1_PreviewTextInput); 

In Ihrem Event-Handler-Test ist das eingegebene Zeichen eine Ziffer.

private void textBox1_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    if (!char.IsDigit(e.Text, e.Text.Length - 1)) 
     e.Handled = true; 
} 
+0

Das hat perfekt funktioniert. Vielen Dank, dass Sie sich die Zeit genommen haben, meine Frage zu beantworten. –

+0

Das ist gut, @DanLuxford Ich werde mich freuen, wenn Sie meine Antwort mit grünem Häkchen akzeptieren :-) – Gabriel

0

Wenn Sie verwenden vermeiden wollen Code-behind, können Sie die oben genannte Antwort in ein Verhalten konvertieren, indem Erstellen einer Klasse (z DigitsOnlyBehavior), die eine AttachedProperty enthält. Wenn die angefügte Eigenschaft festgelegt ist, registrieren Sie den Handler, der in Ihrer Verhaltensklasse definiert und implementiert ist.

Ein kurzes Beispiel:

public static class MyBehavior 
{ 
    public static readonly DependencyProperty AllowOnlyDigitsProperty = DependencyProperty.RegisterAttached(
    "AllowOnlyDigits", typeof(bool), typeof(MyBehavior), new PropertyMetadata(default(bool), OnAllowOnlyDigitsChanged)); 

    private static void OnAllowOnlyDigitsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
    var textBox = d as TextBox; 
    if (textBox == null) return; 
    textBox.PreviewTextInput += PreviewTextBoxInput; 
    } 

    public static void SetAllowOnlyDigits(DependencyObject element, bool value) 
    { 
    element.SetValue(AllowOnlyDigitsProperty, value); 
    } 

    private static void PreviewTextBoxInput(object sender, TextCompositionEventArgs e) 
    { 
    var textbox = sender as TextBox; 

    if (!char.IsDigit(e.Text, e.Text.Length - 1)) 
     e.Handled = true; 
    } 


    public static bool GetAllowOnlyDigits(DependencyObject element) 
    { 
    return (bool) element.GetValue(AllowOnlyDigitsProperty); 
    } 
} 

Wie Sie die PreviewTextBoxInput Funktion ist vor allem sehen, was die früheren Post vermuten lässt.

Sie können nun „anhängen“, dass das Verhalten in XAML wie folgt aus:

<TextBox local:MyBehavior.AllowOnlyDigits="True" />  

Diese Lösung nicht vollständig abgeschlossen ist, da es nicht die Eigenschaft zu ändern unterstützt (es wird der Handler jedes Mal, wenn die Eigenschaft anhängen ändert, so nimmt es an, dass Sie es nur einmal über XAML setzen). Aber wenn Sie dieses Verhalten während der Laufzeit nicht ändern möchten, geht es Ihnen gut.

+0

Hallo Markus. Ich bin mit der obigen Antwort gegangen, aus dem einfachen Grund, dass es für jemanden meiner Unerfahrenheit viel weniger abschreckend aussieht. –

+0

Das ist auch gut. Viele Entwickler, die ich mit WPF getroffen habe, versuchen, den Code innerhalb des "Code Behind" der Ansichten zu minimieren. –

Verwandte Themen