c# - 行数限制,包括换行和换行
问题描述
我需要计算 UWP 中的行数TextBox
。这是为了强制在TextBox
. 从理论上讲,这似乎很简单,但在实践中似乎并不那么清楚。
要求是一个不水平或垂直滚动的文本框。当它达到宽度限制时,它会换行 - 而且,当它达到最大行数时,它不应该垂直滚动,而是应该禁用任何进一步的输入。用户还可以按返回键添加他们想要的任何新行,但不能超过最大行数。
我不认为我可以设置 xaml 属性的组合TextBox
来实现这一点,所以我认为它必须在文本更改事件中。因此,为了强制限制行数,我必须计算它们。我已经尝试过了:
int numLines = txtBox.Text.Split(new string[] { "\r\n" }, StringSplitOptions.None).Length;
if (numLines > maxLines)
{
// reject edit
}
但是,这只返回用户手动输入的换行符 - 不是换行!换行符似乎根本没有在Text
属性中显示为任何 ascii 字符,因此检测它们很困难。
我的问题是TextBox
:考虑到换行和换行符,如何对控件中的行数实施限制?
解决方案
但是,这只返回用户手动输入的换行符 - 不是换行!
TextBox
包含GetRectFromCharacterIndex
可用于获取特定字符矩形的方法。矩形有行高和底值,你可以用底/行高计算当前行号。
以下是TextBox
最后一个字符计算步骤的行号。
var specificRect = MyTextBox.GetRectFromCharacterIndex(MyTextBox.Text.Length-1, true);
var lineNumber = Math.Round(specificRect.Bottom / specificRect.Height);
System.Diagnostics.Debug.WriteLine("Line Number:" + lineNumber);