2010-11-11 8 views
0

J'ai, comme beaucoup, besoin de créer un contrôle de zone de texte numérique dans WPF. J'ai fait de bons progrès jusqu'ici, mais je ne suis pas sûr de la bonne approche pour la prochaine étape.Comment forcer la valeur d'une zone de texte sous-classée?

Dans le cadre de la spécification du contrôle, il faut toujours afficher un nombre. Si l'utilisateur met en surbrillance tout le texte et tape retour arrière ou supprimer, je dois m'assurer que la valeur est définie sur zéro, pas "vide". Comment dois-je faire cela dans le modèle de contrôle WPF?

Ce que j'ai jusqu'à présent (en abrégé):

public class PositiveIntegerTextBox : TextBox 
{ 
    protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e) 
    { 
     // Ensure typed characters are numeric 
    } 

    protected override void OnPreviewDrop(DragEventArgs e) 
    { 
     // Ensure the dropped text is numeric. 
    } 

    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     if (this.Text == string.Empty) 
     { 
      this.Text = "0"; 
      // Setting the Text will fire OnTextChanged again-- 
      // Set Handled so all the other handlers only get called once. 
      e.Handled = true; 
     } 

     base.OnTextChanged(e); 
    } 

    private void HandlePreviewExecutedHandler(object sender, ExecutedRoutedEventArgs e) 
    { 
     // If something's being pasted, make sure it's numeric 
    } 
} 

D'une part, cela est simple et semble bien fonctionner. Je ne suis pas sûr que ce soit correct cependant parce que nous sommes toujours (si jamais si brièvement) réglant le texte pour être vide avant de le remettre à zéro. Il n'y a pas d'événement PreviewTextChanged qui me permette de manipuler la valeur avant qu'elle ne soit modifiée, donc c'est ma meilleure estimation.

Est-ce correct?

Répondre

0

Pourquoi ne pas simplement utiliser votre gestionnaire OnPreviewTextInput pour vérifier si la valeur entrante est un entier ou non, essayez de le convertir ...

Convert.ToInt32(e.Text); 

Si la conversion échoue, il n'est pas un entier et donc marquez-le comme manipulé afin que le texte ne change pas.

Bien que cela puisse légèrement transgresser votre besoin, par exemple ... supprimer tout le texte ne reviendrait pas à 0, il resterait cependant un int. Personnellement, je pense que du point de vue de l'interface utilisateur, cela est plus logique, en ce sens pourquoi la suppression de toutes les entrées déplace-t-elle la valeur à 0? Cela en soi définit le TextBox comme acceptant des valeurs non int puisque l'interface utilisateur change dans ces conditions.

+0

Malheureusement, ce n'est pas si simple. OnPreviewTextInput se déclenche uniquement lors de la saisie de texte. Il ne se déclenche pas si la barre d'espace est sélectionnée, par exemple, ou si le texte est sélectionné et que l'option Supprimer ou Retour arrière est sélectionnée. –

+0

Ensuite, vous pourriez obtenir à avaler les coups de touches brutes au besoin ... avez-vous vérifié cela ... http: //msdn.microsoft.com/en-us/library/ms229644 (VS.80) .aspx –

+0

Ouais , mais merci pour le lien tout de même. :) Heureusement, mon scénario spécifique me permet de limiter ma boîte à un PositiveIntegerTextBox. Si je devais supporter des nombres décimaux/négatifs, je devrais y aller. (Les choses deviennent vraiment moche dans le scénario complet pour coller et glisser/déposer, pour autant que je sache.) –

Questions connexes