Как определить, сколько пробелов в 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";
Он будет делать то, что нам нужно.