C# WPF文本框滚动线不更新(如果可见)

C# WPF文本框滚动线不更新(如果可见),c#,wpf,textbox,C#,Wpf,Textbox,我的程序中有一个导航栏,允许你在我的文本框中导航不同的部分,但我的问题是,如果我滚动到的文本在屏幕上已经可见,这就不起作用了 就像在这个例子中,如果我尝试从第1节跳到第3节,它将无法工作,因为它已经可见 但是,在这个例子中,如果我跳到第3节,它可以正常工作,因为它还不可见 我使用的滚动功能非常简单: if (nLine > 0 && nLine <= textBox.LineCount) textBox.ScrollToLine(nLine - 1);

我的程序中有一个导航栏,允许你在我的文本框中导航不同的部分,但我的问题是,如果我滚动到的文本在屏幕上已经可见,这就不起作用了

就像在这个例子中,如果我尝试从第1节跳到第3节,它将无法工作,因为它已经可见

但是,在这个例子中,如果我跳到第3节,它可以正常工作,因为它还不可见

我使用的滚动功能非常简单:

if (nLine > 0 && nLine <= textBox.LineCount)
    textBox.ScrollToLine(nLine - 1); 
if(nLine>0&&nLine 0&&newLineValue可用于获取所需行开头的索引,然后将设置为该值


因为我真的不知道,你想实现什么,另一种可能是使用并与and结合使用。

它不起作用的原因是ScrollToLine只做它在文档中所说的:“在指定的行索引中将行滚动到视图中。”。这意味着,如果它已经可见,它不会滚动!是的,谢谢Daniel。虽然可能是这样,但我正在尝试解决这个问题,但我会更新以反映这一点。:)我基本上允许用户使用导航栏滚动到文本文档的特定部分。为了方便用户,我始终希望该部分位于文档的顶部。可能值得一提的是,导航栏项目只包含行和节的名称。我能够使用您的第二个建议获得一个有效的解决方案。干杯。:)
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
                }
            }
        }
    }
}