Я пытаюсь ограничить количество строк, которые пользователь может ввести в текстовое поле.Ограничить количество строк, введенных в текстовое поле WPF
Я занимаюсь исследованием - ближайший я могу найти это: Limit the max number of chars per line in a textbox.
И Limit the max number of chars per line in a textbox, который оказывается для winforms.
Это не совсем то, что мне нужно ... также стоит упомянуть, что есть вводящее в заблуждение свойство maxlines, которое я обнаружил, только ограничивает то, что показано в текстовом поле.
Мои требования:
- Не требуют использования моно разнесены шрифта
- Limit текстовое поле, чтобы имея максимум 5 линий
- принимает возврат каретки
- Не разрешайте возврат каретки
- Остановка ввода текста, когда максимальная длина достигнута
- Обтекает текст (не особо заботясь о том, s между словами или разрывает целые слова)
- Обрабатывает текст, вставляемый в элемент управления, и будет вставлять только то, что подойдет. не
- Нет полосы прокрутки
- Кроме того - и это было бы неплохо - имея возможность ограничения количества символов в строке
Эти требования для создания WYSIWYG текстового поля, которое будет использоваться для сбора данных, которые будут в конечном итоге печататься, а шрифты должны быть изменены - если текст обрезается или слишком велик для строки фиксированного размера, тогда он будет распечатан (даже если он выглядит не так).
У меня был удар, когда я делал это сам, занимаясь событиями, но у меня есть большие проблемы с этим. Вот мой код до сих пор.
XAML
<TextBox TextWrapping="Wrap" AcceptsReturn="True"
PreviewTextInput="UIElement_OnPreviewTextInput"
TextChanged="TextBoxBase_OnTextChanged" />
Код За
public int TextBoxMaxAllowedLines { get; set; }
public int TextBoxMaxAllowedCharactersPerLine { get; set; }
public MainWindow()
{
InitializeComponent();
TextBoxMaxAllowedLines = 5;
TextBoxMaxAllowedCharactersPerLine = 50;
}
private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;
int textLineCount = textBox.LineCount;
if (textLineCount > TextBoxMaxAllowedLines)
{
StringBuilder text = new StringBuilder();
for (int i = 0; i < TextBoxMaxAllowedLines; i++)
text.Append(textBox.GetLineText(i));
textBox.Text = text.ToString();
}
}
private void UIElement_OnPreviewTextInput(object sender, TextCompositionEventArgs e)
{
TextBox textBox = (TextBox)sender;
int textLineCount = textBox.LineCount;
for (int i = 0; i < textLineCount; i++)
{
var line = textBox.GetLineText(i);
if (i == TextBoxMaxAllowedLines-1)
{
int selectStart = textBox.SelectionStart;
textBox.Text = textBox.Text.TrimEnd('\r', '\n');
textBox.SelectionStart = selectStart;
//Last line
if (line.Length > TextBoxMaxAllowedCharactersPerLine)
e.Handled = true;
}
else
{
if (line.Length > TextBoxMaxAllowedCharactersPerLine-1 && !line.EndsWith("\r\n"))
e.Handled = true;
}
}
}
Это не совсем правильно работать - я получаю странное поведение на последней строке, и выбранная позиция в текстовое поле сохраняет прыгать.
Как и в сторону, может быть, я иду вниз неверный след ... Мне было также интересно, если это может быть достигнуто с помощью регулярного выражения, используя что-то вроде этого: https://stackoverflow.com/a/1103822/685341
Я открыт для любых идей, как Я боролся с этим некоторое время. Требования, перечисленные выше, являются неизменными - я не могу их изменить.
Я не уверен, что это полезно в моей ситуации, когда я не знаю, сколько времени занимает строка, и я не ожидаю возврата каретки или новых строк в строке (так как это только пользователь, вводящий слово- обертывание текстового поля. Не зная, какой шрифт я использую (и, возможно, только в том случае, если я использую шрифт с одним интервалом), я не могу рассчитать длины строк в коде позади; единственный способ получить это, что я нашел, - попросить сам контроль, сколько строк было введено. Решение, которое я разместил, делает именно это и предотвращает дальнейший ввод. это хаки. – Jay
Я неправильно понял то, что вы искали, когда вы говорили о количестве строк. Это легко решить - вы можете сделать что-то похожее на код в своем событии OnTextBoxTextChanged и адаптировать его для использования в методе CoerceTextLineLimiter. Передайте параметр d в текстовое поле: ((TextBox) d), чтобы получить значение LineCount, затем вы можете напрямую использовать значение текстовых данных ((String)), и данные в текстовом поле будут отвечать. Однако не нужно ссылаться. –