每次按下“ENTER”键时,如何将行号附加到多行文本框中每行的开头?

时间:2018-06-11 22:52:57

标签: c# wpf textbox line-numbers

我经历过这些,但他们在我的情况下并没有帮助我

这在我的情况下不起作用,因为它在答案中包含KeyData或KeyCode方法,当我尝试运行时显示错误。 How to add number in each new line in a multiline textbox C# / ASP.net

我试过这个在我的情况下不起作用,因为它在按下按钮时使用 Adding new line of data to TextBox

这个只是添加一些字符串,如第一,第二,第三,这就是,这对我的情况没有帮助。 https://www.codeproject.com/Questions/320713/Adding-new-line-in-textbox-without-repalcing-exist

我在Google上搜索了20个搜索结果,其中许多搜索结果不相关,而其他搜索结果对我的情况没有帮助。

2 个答案:

答案 0 :(得分:0)

如果我理解这个问题,你想在文本框中添加每个新行的行号。要做到这一点,您需要在视图中使用TextBox事件添加KeyDown

<TextBox KeyDown="TextBox_KeyDown" x:Name="txtBox" />

然后,在视图的代码隐藏中,您可以检查键是&#34;输入&#34;键并将行号添加到文本

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        string txt = txtBox.Text;
        int lineNumber = txt.Split('\n').Length + 1;
        txtBox.Text += '\n' + lineNumber.ToString();
        txtBox.CaretIndex = txtBox.Text.Length;
    }
}

备注

  • txtBox.CaretIndex = txtBox.Text.Length;在编辑后将插入符号放在文本的末尾。否则,当您按Enter键时,插入符将重置为文本的开头。
  • 当文本框为空时,您需要附加第一个行号。
  • 您可能需要处理编辑,例如,以便用户无法删除行号。例如。

修改

如果使用AcceptsReturn的{​​{1}}属性,则事件TextBox由TextBox直接处理,并且注释冒充父母。在这种情况下,您必须使用KeyDown事件,请参阅MSDN Routing Strategies

答案 1 :(得分:0)

我通过computhoms尝试了答案它并没有按照我想要的方式工作。

首先,KeyDown事件没有生成任何结果,似乎按下Enter键时KeyDown事件不会触发,也不会生成任何结果。 所以我使用的PreviewKeyDown事件起作用。

其次,它没有写第一行的行号。同样对于后续数字,它会在新行中创建数字,然后将光标移动到另一行,因此效果将如下:

一些文字

2

一些文字

3

一些文字

等等。

我想要的结果是我希望它是这样的:

1-some text。

2-some text。

3-some text。

所以我修改了Computhos给出的代码,它给了我正确的结果。 这是我使用的代码:

在xaml中创建TextBox并像这样创建PreviewKeyDown事件

  <TextBox  PreviewKeyDown="LifeGoalsTextBox_PreviewKeyDown" x:Name="LifeGoalsTextBox" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />

我去了后面的代码并编写了这段代码:

private void LifeGoalsTextBox_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                string txt = LifeGoalsTextBox.Text;
                int lineNumber = txt.Split('\n').Length ;
                string lineNumberString = lineNumber.ToString();

                if (lineNumber == 0)
                {
                    LifeGoalsTextBox.Text = LifeGoalsTextBox.Text.Insert(0, "1") + '-';
                }
                else
                {
                    lineNumber++;
                    int lastLine = 1 + LifeGoalsTextBox.Text.LastIndexOf('\n');
                    LifeGoalsTextBox.Text = LifeGoalsTextBox.Text.Insert(lastLine, lineNumberString+ '-') ;

                    LifeGoalsTextBox.CaretIndex = LifeGoalsTextBox.Text.Length;
                }
            }
        }