2009-05-21 17 views

Antwort

6

Überprüfen Sie das Ereignis KeyDown der Textbox und tun, wie

  // If escape is presses, then close the window. 
      if(Key.Escape == e.Key) 
      { 
       this.Close(); 
      } 
      // Allow alphanumeric and space. 
      if(e.Key >= Key.D0 && e.Key <= Key.D9 || 
       e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9 || 
       e.Key >= Key.A && e.Key <= Key.Z || 
       e.Key == Key.Space) 
      { 
       e.Handled = false; 
      } 
      else 
      { 
       e.Handled = true; 
      } 

      // If tab is presses, then the focus must go to the 
      // next control. 
      if(e.Key == Key.Tab) 
      { 
       e.Handled = false; 
      } 

Hope this helfen ......

+0

BTW, die Signatur für den Handler ist: private void OnKeyDownHandler (object sender, KeyEventArgs e) – Jeff

0

Der KeyDown Event-Handler ist möglicherweise nicht der beste Ort, um dies zu tun, da das Zeichen bereits der TextBox hinzugefügt wurde. Sie könnten auf das PreviewKeyDown-Ereignis reagieren und verhindern, dass das Ereignis fortgesetzt wird. Dies kann jedoch unbekannte Konsequenzen haben.

Ein Ansatz wäre, eine ValidationRule an die TextBox anzuhängen. Obwohl dies den Benutzer nicht daran hindern würde, den Charakter einzugeben, würde er sie darüber informieren, dass es ihnen nicht erlaubt ist. Dazu müssen Sie aus System.Windows.Controls.ValidationRule ableiten, so etwas zu bekommen:

public class MyValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     // Logic to determine if the TextBox contains a valid string goes here 
     // Maybe a reg ex that only matches alphanumerics and spaces 
     if(isValidText) 
     { 
      return ValidationResult.ValidResult; 
     } 
     else 
     { 
      return new ValidationResult(false, "You should only enter an alphanumeric character or space"); 
     } 
    } 
} 

Und es dann so in XAML verwenden:

<TextBox> 
    <TextBox.Text> 
     <Binding Path="MyString" 
       UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <myns:MyValidationRule /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

Jedes Mal, wenn der Benutzer gibt ein ungültiges Zeichen Sie erhalten die Fehlermeldung. Hoffe, das ist von Nutzen.

0

Sie auch die Preview Ereignis der Textbox verwenden können.

<TextBox Name="txtName" PreviewTextInput="txtName_PreviewTextInput"/> 

und die folgenden in Ihrem Code hinter hinzufügen:

private void txtName_PreviewTextInput(object sender, TextCompositionEventArgs e) 
    { 
     foreach (char c in e.Text) 
     { 
      if (!char.IsLetterOrDigit(c)) 
      { 
       e.Handled = true; 
       break; 
      } 
     } 
    } 
0

Ich denke DONot sein eine gute Praxis KeyDown zu verwenden. Der Nachteil ist, dass Sie die Rücktaste, löschen und Tab-Tasten auch behandeln müssen.

Statt: Griff Preview

private void OnPreviewTextInput(object sender, TextCompositionEventArgs e) 
    { 
     if (!IsMatch(e.Text)) e.Handled = true; 
    } 

    private bool IsMatch(string input) 
    { 
     return Regex.IsMatch(input, MyRegexString); 
    } 

dann muss PasteHandler kümmern: add in Konstruktor folgende Zeile.

DataObject.AddPastingHandler(TargetTextBoxName, PasteHandler); 

    private void PasteHandler(object sender, DataObjectPastingEventArgs e) 
     { 
      if (!e.DataObject.GetDataPresent(typeof(string))) return; 
      // Allow pasting only numeric 
      var pasteText = e.DataObject.GetData(typeof(string)) as string; 
      if (!IsMatch(pasteText)) 
      { 
       e.CancelCommand(); 
      } 
     } 
+0

Ihre regex wird "^ [a-zA-Z0-9]" – kkk

Verwandte Themen