【发布时间】:2016-01-13 21:04:20
【问题描述】:
我正在尝试限制用户可以在文本框中输入的行数。
我一直在研究 - 我能找到的最接近的是: Limit the max number of chars per line in a textbox.
而Limit the max number of chars per line in a textbox 原来是用于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://stackoverflow.com/a/1103822/685341
我对任何想法都持开放态度,因为我已经为此苦苦挣扎了一段时间。上面列出的要求是不可变的 - 我无法更改它们。
【问题讨论】: