2010-02-24 2 views
11

Когда пользователь нажимает вкладку в этом текстовом поле, курсор перескакивает на эквивалент 8 пробелов.Как определить количество пробелов в TAB в XAML TextBox?

Как я могу изменить его так, чтобы он прыгал только 4 или 2?

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

Эдвард, если я предлагаю решение с заменой вкладок пробелами, будет ли оно работать на вас? – Anvaka

+0

Я никогда не видел этого в XAML. Только в реальных редакторах. –

ответ

0

Я предлагаю вам взглянуть на Typography property of the TextBox. Несмотря на то, что я не мог сразу найти что-либо о размерах вкладок, это свойство, которое влияет на способ отображения текста TextBox, чтобы он мог быть тем, что вы ищете.

0

Попробуйте элемент управления, который позволяет установить размер вкладки. Возможно http://wpfsyntax.codeplex.com/ будет делать?

+4

Этот элемент управления просто заменяет закладки пробелами. –

2

Вы можете создать свой собственный контроль TextBox, чтобы дать желаемый эффект:

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

Тогда вы просто использовать следующее в вашем XAML:

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

Смотрите следующий оригинальный ответ: http://social.msdn.microsoft.com/Forums/en/wpf/thread/0d267009-5480-4314-8929-d4f8d8687cfd

+0

Быстрые комментарии: Я думаю, вы хотите удалить '+ 1' на' base.CaretIndex = ', я бы, вероятно, вытащил строку« String tab ... »и поместил ее в setTabSize, re DRY-er при выполнении, и ** что наиболее важно, если вы не добавляете ** 'base.SelectedText = string.Empty;' для первой строки после вашего предложения 'if', ** странные вещи произойдут, если кто-то , например, выделяет вкладку слов и хитов **, ожидая, что слово исчезнет и будет заменено вкладкой «символ». В противном случае очень приятно! – ruffin

0

Одна из проблем с решением, предоставленным Джейсоном, заключается в том, что изменение текста стирает стопку отмены. Альтернативным решением является использование метода Paste. Для этого вам сначала нужно скопировать строку вкладок в буфер обмена.

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

Я не вижу никаких проблем с отменой - можете ли вы объяснить, что вы имеете в виду? Используя идею Джейсона, я могу ctrl-z выйти за вкладку «tab». – ruffin

0

Да, это возможно ....

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

Он будет делать то, что нам нужно!

+0

требуется редактирование – GAMITG