Как определить, сколько пробелов в TAB происходит в XAML TextBox?

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

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

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

Ответ 1

Вы можете создать свой собственный элемент управления 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

Ответ 2

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

Ответ 3

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

Ответ 4

Одна из проблем с решением Jason заключается в том, что изменение текста стирает стопку отмены. Альтернативным решением является использование метода 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;
        }
    }
}

Ответ 5

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

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

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