从带有换行的文本框中获取 LineCount

Get LineCount from a textbox with wrapping

我想得到有多少行的文本框换行。以下代码无效。

void txt_Loaded(object sender, RoutedEventArgs e)
{
       TextBox t = (TextBox)sender;
       var count = t.LinesCount; // wrong;
       // or
       var lineCount = t.Text.Split(new[] {'\n','r'}).length;
}

我有三行,但是var lineCount = t.Text.Split(new[] {'\n','r'}).length; returns 4.

您的代码中有错字,正在寻找字母 r 而不是回车符 return \r

尝试var lineCount = t.Text.Split(new[] {'\n','\r'}).length;

另一种选择是如上所述拆分,然后将每行的长度除以单行上可以包含的字符数。您可能需要对此进行计算,因为 TextBox 似乎没有 Columns 属性.

如果要查找换行数,可以使用GetLineIndexFromCharacterIndex()
作为参数,您可以传递最后一个字符(对应于 Text.Lenght)。

int WrappedLines1 = TextBox.GetLineIndexFromCharacterIndex(TextBox.Text.Length) + 1;

TextBox.LineCount().
第一种方法returns一个从零开始的索引,第二种方法从1开始计数。

int WrappedLines2 = TextBox.LineCount;

物理行数(用换行符分隔的行数)可以用Split().Count()来计算。

int LineFeedsCount = TextBox.Text.Split(new[] { "\n" }, StringSplitOptions.None).Count();

如果您不想计算空行,请使用 StringSplitOptions.RemoveEmptyEntries 作为选项参数。

您可以验证行数是否正确,将 TextWrapping 属性 设置为 .NoWrap 并用 .LineCount.
计算行数

TextBox1.TextWrapping = TextWrapping.NoWrap;
int LineFeedsCount = TextBox1.LineCount;

我想我找到了 LineCount 不起作用的原因。`

TextBox 实际上在DataColumn 中。我将宽度设置为 2*.

<telerik:GridViewDataColumn Header="Info" DataMemberBinding="{Binding Info}"  Width="2*">
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox
                            AcceptsReturn="True"
                            TextWrapping="Wrap" 
                            Text="{Binding Info, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                            Loaded="TextBox_Loaded"/>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>`. 

宽度 属性 导致了问题。如果我删除它然后它工作。但我需要宽度,不确定为什么以及如何?