我想限制用户在文本框中输入的行数。
我已经进行了一些研究——最接近我的是这个:限制文本框中每行字符的最大数量。
还有一个限制文本框中每行字符的最大数量,但结果是针对winforms的。
这并不完全符合我的要求...值得一提的是,有一个误导性的maxlines属性,我发现它只限制了文本框中显示的内容。
我的要求如下:
我已经尝试通过处理事件来实现这一点,但是很难做到正确。以下是我的代码: XAML
这个好像不太对——最后一行的行为很奇怪,文本框内选择的位置总是跳来跳去。
另外,也许我走了一条错误的路...... 我还想知道是否可以使用正则表达式来实现这一目标,例如使用这个:https://dev59.com/4XNA5IYBdhLWcg3wEZeT#1103822 我对任何想法都持开放态度,因为我已经苦恼了一段时间。上面列出的要求是不可改变的,我无法更改它们。
我已经进行了一些研究——最接近我的是这个:限制文本框中每行字符的最大数量。
还有一个限制文本框中每行字符的最大数量,但结果是针对winforms的。
这并不完全符合我的要求...值得一提的是,有一个误导性的maxlines属性,我发现它只限制了文本框中显示的内容。
我的要求如下:
- 不需要使用等宽字体
- 将文本框限制为最多5行
- 接受回车
- 不允许额外的回车
- 当达到最大长度时停止文本输入
- 换行(不特别关心是在单词之间换行还是整个单词分开)
- 处理文本被粘贴到控件中,并只粘贴适合的文本。
- 没有滚动条
- 此外,如果可以限制每行的字符数,那就太好了
我已经尝试通过处理事件来实现这一点,但是很难做到正确。以下是我的代码: 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://dev59.com/4XNA5IYBdhLWcg3wEZeT#1103822 我对任何想法都持开放态度,因为我已经苦恼了一段时间。上面列出的要求是不可改变的,我无法更改它们。