2009-04-02 12 views
7

¿Cómo puedo capturar una pestaña ingresada en un Silverlight TextBox y representar 4 espacios (o una pestaña) en su lugar?Pestaña de captura en Silverlight TextBox

No puedo averiguar cómo bloquear la navegación de pestañas.

+0

¿El control de cuadro de texto en Silverlight tiene una propiedad "AcceptsTab"? Debería configurarlo en True para que la clave de tabulación sea procesada por el TextBox. –

+0

no, no veo esa propiedad en Intellisense o en Expression Blend –

Respuesta

8

Ella e es lo que hago (similar a Johannes' código):

 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; 
     } 
    } 

Esto comporta cómo espera que incluso si selecciona texto y pulsa el viejo tecla 'Tab'.

Una cosa más: Intenté tener la cadena de pestañas como "\ t", pero fue en vano. La pestaña procesada, pero era el ancho de un espacio único; de ahí que el valor de la pestaña sea de cuatro espacios.

1

No estoy seguro de cómo resolver su problema, aunque trabé una solución que parece funcionar.

Establezca el evento KeyDown de la siguiente manera.

expenses.KeyDown += new KeyEventHandler(expenses_KeyDown); 

En tal caso, pongo el siguiente código:

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

Y luego, en LostFocus:

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

La última línea de LostFocus establece el cursor de edición al final del texto De lo contrario, cuando se enfoca, la posición del cursor está en el principio del cuadro de texto

1

esto parecía funcionar bien para mí, y no requiere el segundo controlador de eventos o codificación dura del nombre de cuadro de texto:

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); 
      } 
     } 
Cuestiones relacionadas