2010-02-24 19 views
11

Cuando el usuario presiona una pestaña en este cuadro de texto, el cursor salta un equivalente de 8 espacios.¿Cómo puedo definir cuántos espacios salta una TAB en un XAML TextBox?

¿Cómo puedo cambiarlo para que salte solo 4 o 2?

<TextBox 
    Width="200" 
    Height="200" 
    Margin="0 0 10 0" 
    AcceptsReturn="True" 
    AcceptsTab="True" 
    Text="{Binding OutlineText}"/> 
+0

Edward, si sugiero una solución con el reemplazo de pestañas con espacios, ¿le servirá? – Anvaka

+0

Nunca lo he visto hecho en XAML. Solo en los editores actuales –

Respuesta

0

le sugiero que tome un vistazo a Typography property of the TextBox. Aunque no pude encontrar inmediatamente nada sobre el tamaño de las pestañas, esta es la propiedad que afecta la forma en que el TextBox procesa el texto, por lo que podría ser lo que está buscando.

2

Usted puede crear su propio control de cuadro de texto para dar el efecto deseado:

public class MyTextBox : TextBox 
{ 
    public MyTextBox() 
    { 
     //Defaults to 4 
     TabSize = 4; 
    } 

    public int TabSize 
    { 
     get; 
     set; 
    } 

    protected override void OnPreviewKeyDown(KeyEventArgs e) 
    { 
     if (e.Key == Key.Tab) 
     { 
      String tab = new String(' ', TabSize); 
      int caretPosition = base.CaretIndex; 
      base.Text = base.Text.Insert(caretPosition, tab); 
      base.CaretIndex = caretPosition + TabSize + 1; 
      e.Handled = true; 
     } 
    } 
} 

A continuación, sólo tiene que utilizar lo siguiente en su xaml:

<cc:MyTextBox AcceptsReturn="True" TabSize="10" x:Name="textBox"/> 

Ver la siguiente respuesta original: http://social.msdn.microsoft.com/Forums/en/wpf/thread/0d267009-5480-4314-8929-d4f8d8687cfd

+0

Comentarios rápidos: creo que desea eliminar el '+ 1' en' base.CaretIndex = ', probablemente saque la línea' String tab ... 'y la coloque en el fijador' TabSize' para que ' re DRY-er en ejecución, y ** lo más importante, si no agrega ** 'base.SelectedText = string.Empty;' para la primera línea después de su cláusula 'if', ** cosas extrañas sucederán si alguien , por ejemplo, resalta una palabra e ingresa a la pestaña **, esperando que la palabra desaparezca y sea reemplazada por la pestaña "personaje". De lo contrario muy agradable! – ruffin

0

Un problema con la solución proporcionada por Jason es que al modificar el texto se borrará la pila de deshacer. Una solución alternativa es usar el método Paste. Para hacer esto primero debes copiar tu cadena de pestañas al portapapeles.

public class MyTextBox : TextBox 
{ 
    public MyTextBox() 
    { 
     //Defaults to 4 
     TabSize = 4; 
    } 

    public int TabSize { get; set; } 

    protected override void OnPreviewKeyDown(KeyEventArgs e) 
    { 
     if (e.Key == Key.Tab) 
     { 
      var data = Clipboard.GetDataObject(); 
      var tab = new String(' ', TabSize); 
      Clipboard.SetData(DataFormats.Text, tab); 
      Paste(); 
      //put the original clipboard data back 
      if (data != null) 
      { 
       Clipboard.SetDataObject(data); 
      } 
      e.Handled = true; 
     } 
    } 
} 
+0

No veo ningún problema con deshacer, ¿puedes explicar a qué te refieres? Usando la idea de Jason, puedo ctrl-z más allá de la inserción de "tabulación". – ruffin

0

sí es posible ....

TextBlock.Text = "ABC" + string.Format ("{0}", "\ t") + "XYZ";

¡Hará lo que necesitemos!

+0

requiere editar – GAMITG

Cuestiones relacionadas