WPF TextBox ScrollToLine如果可见则不更新

时间:2011-03-10 15:48:35

标签: c# wpf textbox

我的程序中有一个导航栏,允许您导航我的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 个答案:

答案 0 :(得分:2)

您可以使用GetCharacterIndexFromLineIndex获取所需行开头的索引,然后将CaretIndex设置为该值。

因为我真的不知道,你想要实现什么,另一种可能性是将LineUpLineDownGetFirstVisibleLineIndexGetLastVisibleLineIndex结合使用。< / p>