2010-06-26 10 views
1

J'utilise un contrôle AutoCompleteBox dans mon projet. Maintenant, je dois limiter la longueur du texte qu'un utilisateur peut entrer, par ex. de la longueur maximale de 50 caractères. Dans ce cas, TextBox a la propriété MaxLength, mais pas AutoCompleteBox. En outre, AutoCompleteBox n'expose pas les propriétés de TextBox.MaxLength pour AutoCompleteBox dans Silverlight

J'ai essayé de résoudre le problème de cette façon:

private void autoCompleteBox_TextChanged(object sender, RoutedEventArgs e) 
{ 
     AutoCompleteBox autoCompleteBox = sender as AutoCompleteBox; 
     if (autoCompleteBox.Text.Length > MaxCharLength) 
     { 
      autoCompleteBox.Text = autoCompleteBox.Text.Substring(0, MaxCharLength); 
     } 
} 

Un gros inconvénient de cette méthode est que lorsque la propriété de texte, la zone de texte caret est remis à la position de départ, et lorsqu'un utilisateur continuez à taper, les caractères à la fin sont coupés et le curseur va toujours au début. Aucune méthode n'est exposée pour contrôler le signe insertion (comme la méthode Select de TextBox).

Des idées comment la longueur maximale peut-elle être définie pour AutoCompleteBox?

Répondre

1

Que diriez-vous ....

public class CustomAutoCompleteBox : AutoCompleteBox 
{ 
    private int _maxlength; 
    public int MaxLength 
    { 
     get 
     { 
      return _maxlength; 
     } 
     set 
     { 
      _maxlength = value; 
      if (tb != null) 
       tb.MaxLength = value; 
     } 
    } 

    TextBox tb; 
    public override void OnApplyTemplate() 
    { 
     tb = this.GetTemplateChild("Text") as TextBox; 
     base.OnApplyTemplate(); 
    } 
} 
1

Le problème peut être résolu par le sous-classement de la classe de contrôle, à partir de laquelle AutoCompleteBox est dérivé, de cette façon:

public class AutoCompleteBoxMaxLengthed : AutoCompleteBox 
{ 
    public int MaxLength 
    { 
     get; 
     set; 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (Text.Length >= MaxLength) 
     { 
      e.Handled = true; 
     } 
     else 
     { 
      base.OnKeyDown(e); 
     } 
    } 
}