首页 > 解决方案 > 行数限制,包括换行和换行

问题描述

我需要计算 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:考虑到换行和换行符,如何对控件中的行数实施限制?

标签: c#xamluwptextbox

解决方案


但是,这只返回用户手动输入的换行符 - 不是换行!

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);

推荐阅读