Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I define how many spaces a TAB jumps in a XAML TextBox?

When the user presses a tab in this textbox, the cursor jumps an equivalent of 8 spaces.

How can I change it so it jumps only 4 or 2?

<TextBox
    Width="200"
    Height="200"
    Margin="0 0 10 0"
    AcceptsReturn="True"
    AcceptsTab="True"
    Text="{Binding OutlineText}"/>
like image 592
Edward Tanguay Avatar asked Feb 24 '10 12:02

Edward Tanguay


2 Answers

You can create your own TextBox control to give the desired affect:

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

Then you just use the following in your xaml:

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

See the following original answer: http://social.msdn.microsoft.com/Forums/en/wpf/thread/0d267009-5480-4314-8929-d4f8d8687cfd

like image 65
Jason Stevenson Avatar answered Dec 04 '22 23:12

Jason Stevenson


One problem with the solution Jason provided is that modifying the Text will erase the undo stack. An alternative solution is to use the Paste method. In order to do this you first need to copy your tab string to the clipboard.

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;
        }
    }
}
like image 33
webe0316 Avatar answered Dec 04 '22 22:12

webe0316