Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何定义选项卡在XAML文本框中跳转的空格数?_Wpf_Xaml_Textbox_Tabs - Fatal编程技术网

Wpf 如何定义选项卡在XAML文本框中跳转的空格数?

Wpf 如何定义选项卡在XAML文本框中跳转的空格数?,wpf,xaml,textbox,tabs,Wpf,Xaml,Textbox,Tabs,当用户按下此文本框中的选项卡时,光标将跳转相当于8个空格 如何更改它,使其只跳4或2次? <TextBox Width="200" Height="200" Margin="0 0 10 0" AcceptsReturn="True" AcceptsTab="True" Text="{Binding OutlineText}"/> 我建议你看看。尽管我无法立即在其中找到关于选项卡大小的任何信息,但这是影响文本框呈现文本的方式的属性,

当用户按下此文本框中的选项卡时,光标将跳转相当于8个空格

如何更改它,使其只跳4或2次?

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


我建议你看看。尽管我无法立即在其中找到关于选项卡大小的任何信息,但这是影响文本框呈现文本的方式的属性,因此它也可能是您正在查找的内容。

尝试一个允许您设置选项卡大小的控件。大概
可以吗?

您可以创建自己的文本框控件以提供所需的效果:

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


请参阅以下原始答案:

Jason提供的解决方案的一个问题是修改文本将擦除撤消堆栈。另一种解决方案是使用粘贴方法。为此,首先需要将选项卡字符串复制到剪贴板

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

Edward,如果我建议一个用空格替换制表符的解决方案,它对你有用吗?我从来没有见过在XAML中这样做。只有在实际的编辑器中。这个控件只是用空格替换制表符。我看不出撤消有什么问题——你能解释一下你的意思吗?使用Jason的想法,我能够在“tab”插入之外按ctrl-z键。快速评论:我认为您想要删除
base.CaretIndex=
上的
+1
,我可能会拉出
字符串选项卡…
行,并将其放入
TabSize
setter中,以便您在执行时更加干练,最重要的是,如果不添加
base.SelectedText=string.Empty
对于
if
子句后的第一行,如果某人突出显示一个单词并点击tab,期望该单词消失并被tab“character”替换,则会发生奇怪的事情。否则很好!