WPF TextBox ScrollToLine не обновляется, если отображается - PullRequest
0 голосов
/ 10 марта 2011

В моей программе есть панель навигации, которая позволяет вам перемещаться по различным разделам в моем TextBox, но проблема в том, что это не работает, если текст, на который я прокручиваю, уже виден на экране.

Как и в этом примере, если я попытаюсь перейти из Раздела 1 в Раздел 3, он не будет работать, так как он уже виден.

Example 1

Но в этом примере, если я перейду к разделу 3, он работает нормально, так как его уже не видно.

Example 2

Функция прокрутки, которую я использую, очень проста:

if (nLine > 0 && nLine <= textBox.LineCount)
    textBox.ScrollToLine(nLine - 1); 

Я надеюсь, что кто-то сможет пролить свет на альтернативное решение, которое позволяет мне прокручивать, даже если текст уже виден.

Редактировать: Добавлено решение.

Это фрагмент кода из моего проекта.

private static void ScrollToLineCallback(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
    var textBox = (TextBox)target;

    int newLineValue;
    if (Int32.TryParse(e.NewValue.ToString(), out newLineValue))
    {
        if (newLineValue > 0 && newLineValue <= textBox.LineCount) // Validate
        {
            textBox.ScrollToLine(newLineValue - 1); // Scroll to Line

            // Check and see if we are at the line we want.
            if (textBox.GetFirstVisibleLineIndex() <= newLineValue && textBox.GetLastVisibleLineIndex() >= newLineValue)
            {
                // If not lets move to the desired location
                int newLineCorrectionValue = newLineValue - textBox.GetFirstVisibleLineIndex() - 2; // How much further do we need to scroll down?

                for (int i = 0; i < newLineCorrectionValue; i++)
                {
                    textBox.LineDown(); // Scroll down
                }
            }
        }
    }
}

1 Ответ

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

Вы можете использовать GetCharacterIndexFromLineIndex , чтобы получить индекс начала нужной строки, а затем установить CaretIndex на это значение.

Поскольку я недействительно знаете, чего вы пытаетесь достичь, еще одна возможность - использовать LineUp и LineDown в сочетании с GetFirstVisibleLineIndex и GetLastVisibleLineIndex .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...