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

馋奶兔 提交于 2019-12-17 18:57:31

问题


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}"/>

回答1:


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




回答2:


I suggest you take a look at Typography property of the TextBox. Even though I could not immediately find anything about tab size in there, this is the property that affects the way the text is rendered by the TextBox so it might as well be the thing you're looking for.




回答3:


Try a control that allows you to set the tab size. Maybe http://wpfsyntax.codeplex.com/ will do?




回答4:


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


来源:https://stackoverflow.com/questions/2325826/how-can-i-define-how-many-spaces-a-tab-jumps-in-a-xaml-textbox

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!