wpf richtextbox проверяет, находится ли курсор в последней строке, или подсчитывает, сколько строк в нем - PullRequest
2 голосов
/ 10 марта 2011

Я пытаюсь выяснить в поле расширенного текста, находится ли каретка в последней строке. Возможно ли это?

ПРИМЕЧАНИЕ: В конце я также добавил: или посчитайте, сколько строк в нем, это потому, что на форуме miscrosoft есть пример для определения, в какой строке находится каретка.

спасибо

Ответы [ 4 ]

1 голос
/ 10 марта 2011

Пожалуйста, проверьте ссылку MSDN

http://social.msdn.microsoft.com/Forums/en/wpf/thread/667b5d2a-84c3-4bc0-a6c0-33f9933db07f

Если вы действительно хотите узнать номер строки каретки, вы можете сделать что-то вроде следующего (вероятно, нужно немного настроить):

TextPointer caretLineStart = rtb.CaretPosition.GetLineStartPosition(0);
TextPointer p = rtb.Document.ContentStart.GetLineStartPosition(0);
int caretLineNumber = 1;

while (true)
{
    if (caretLineStart.CompareTo(p) < 0)
    {
        break;
    }

    int result;
    p = p.GetLineStartPosition(1, out result);

    if (result == 0)
    {
        break;
    }

    caretLineNumber++;
}
1 голос
/ 16 августа 2012

Код для получения количества строк:

Int32 CountDisplayedLines(RichTextBox rtb)
{
    Int32 result = -1;

    rtb.CaretPosition = rtb.Document.ContentStart;

    while (rtb.CaretPosition.GetLineStartPosition(++result) != null)
    {
    }

    return result;
}
0 голосов
/ 06 февраля 2013

Я попробовал код и не всегда дает правильные результаты. Один умный способ сделать это это

    int previousCursorPosition;
    private void RichTarget_KeyDown_1(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Up || e.Key == Key.Down)
        {
            Xceed.Wpf.Toolkit.RichTextBox rich = (Xceed.Wpf.Toolkit.RichTextBox)sender;
            previousCursorPosition = rich.CaretPosition.GetOffsetToPosition(rich.CaretPosition.DocumentStart);
        }
    }
    private void RichTextBox_KeyUp_1(object sender, KeyEventArgs e)
    {

            if (e.Key == Key.Up)
            {
                Xceed.Wpf.Toolkit.RichTextBox rich = (Xceed.Wpf.Toolkit.RichTextBox)sender;

                if (previousCursorPosition == rich.CaretPosition.GetOffsetToPosition(rich.CaretPosition.DocumentStart))
                {
                     //do your staff

                }

            }
            else if (e.Key == Key.Down)
            {
                Xceed.Wpf.Toolkit.RichTextBox rich = (Xceed.Wpf.Toolkit.RichTextBox)sender;
                if (previousCursorPosition == rich.CaretPosition.GetOffsetToPosition(rich.CaretPosition.DocumentStart))
                {
                    //do your staff
                }
            }


    }
0 голосов
/ 10 марта 2011

Я нашел решение. Может быть, есть более простой способ, если да, пожалуйста, дайте мне знать

    private void OnHasRtbReachedEnd(System.Windows.Controls.RichTextBox rtb)
    {
        TextPointer pointer1 = rtb.CaretPosition;
        int iCurrentLine = GetLineNumber(rtb);
        rtb.CaretPosition = rtb.Document.ContentEnd;
        int iLastLine = GetLineNumber(rtb);

        if (iCurrentLine == iLastLine)
        {
            if (!_bIsRtbMovingUpDown)
                MoveToNextDataGridRow();
            _bIsRtbMovingUpDown= false;
        }
        else
        {
            _bIsRtbMovingUpDown= true;
        }
        rtb.CaretPosition = pointer1;
    }

// Этот код взят из // http://social.msdn.microsoft.com/Forums/en/wpf/thread/667b5d2a-84c3-4bc0-a6c0-33f9933db07f

    private int GetLineNumber(System.Windows.Controls.RichTextBox rtb)
    {
        TextPointer caretLineStart = rtb.CaretPosition.GetLineStartPosition(0);
        TextPointer p = rtb.Document.ContentStart.GetLineStartPosition(0);
        int caretLineNumber = 1;

        while (true)
        {
            if (caretLineStart.CompareTo(p) < 0)
            {
                break;
            }

            int result;
            p = p.GetLineStartPosition(1, out result);

            if (result == 0)
            {
                break;
            }

            caretLineNumber++;
        }
        return caretLineNumber;

    }
...