2009-04-02 6 views
7

Comment puis-je capturer un onglet entré dans une boîte aux lettres Silverlight et rendre 4 espaces (ou un onglet) à sa place?Capture d'un onglet dans Silverlight TextBox

Je n'arrive pas à comprendre comment bloquer la navigation par tabulation.

+0

Est-ce que le contrôle TextBox dans Silverlight ont une propriété « AcceptsTab »? Vous devez définir cela sur True pour que la touche de tabulation soit traitée par TextBox. –

+0

non, je ne vois pas cette propriété dans Intellisense ou dans Expression Blend –

Répondre

8

Son e est ce que je fais (similaire à Johannes de code):

 private const string Tab = " "; 
    void textBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Tab) 
     { 
      int selectionStart = textBox.SelectionStart; 
      textBox.Text = String.Format("{0}{1}{2}", 
       textBox.Text.Substring(0, textBox.SelectionStart), 
       Tab, 
       textBox.Text.Substring(textBox.SelectionStart + textBox.SelectionLength, (textBox.Text.Length) - (textBox.SelectionStart + textBox.SelectionLength)) 
       ); 
      e.Handled = true; 
      textBox.SelectionStart = selectionStart + Tab.Length; 
     } 
    } 

Ce se comporte exactement comment vous vous attendez même si vous sélectionnez un texte et cliquez sur le ol touche « Tab ». Une autre chose: j'ai essayé d'avoir la chaîne de tabulation comme "\ t", mais en vain. L'onglet restitué, mais était la largeur d'un seul espace - d'où la valeur de la const const est quatre espaces.

1

Je ne sais pas comment résoudre votre problème, j'ai piraté une solution qui semble fonctionner.

Définissez l'événement KeyDown comme ci-dessous.

expenses.KeyDown += new KeyEventHandler(expenses_KeyDown); 

Dans ce cas, je mets le code suivant:

void expenses_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.Tab) 
      { 
       expenses.Text += " "; 
       expenses.Focus(); 
       expenses.LostFocus += new RoutedEventHandler(expenses_LostFocus); 
      } 
     } 

Et puis dans LostFocus:

void expenses_LostFocus(object sender, RoutedEventArgs e) 
     { 
      expenses.Focus(); 
      expenses.Select(expenses.Text.Length - 1, 0); 
     } 

La dernière ligne LostFocus définit le curseur d'édition à la fin du texte , sinon, quand il obtient le focus, la position du curseur est au début de la zone de texte

1

Cela semble bien fonctionner pour moi, et ne nécessite pas le second gestionnaire d'événements ou codage en dur de la zone de texte Nom:

void TabbableTextBox_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.Tab) 
      { 
       e.Handled = true; 

       var tb = ((TextBox)sender); 
       tb.Text += "\t"; 
       tb.Select(tb.Text.Length, 0); 
      } 
     } 
Questions connexes