获取WPF TextBox的滚动位置

ygo*_*goe 2 wpf scroll textbox

我需要在WPF TextBox控件的内容中添加一些装饰.基本上工作正常,我可以获得指定字符索引的位置,并相应地布局我的其他元素.但是当TextBox滚动时,它都会中断.我的布局位置不再与显示的文本匹配,因为它已移动到其他位置.

现在,我很惊讶TextBox类没有提供有关其滚动状态的任何信息,也没有提供滚动更改时的任何事件.我现在能做什么?

我使用Snoop来确定是否有一些我可以问的滚动子元素,但ScrollContentPresenter也没有任何可用的滚动信息.我真的很想把我的装饰元素放到滚动区域,这样滚动也会影响它们,但是只能有一个内容控件,而且它已经是TextBox内部的一个.

Joh*_*ibb 7

我不确定如何在滚动文本框时捕获事件(可能使用narohi的答案),但有一种简单的方法可以查看当前滚动位置是什么:

// Gets or sets the vertical scroll position.
textBox.VerticalOffset
Run Code Online (Sandbox Code Playgroud)

(来自http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.textboxbase.verticaloffset(v=vs.100).aspx)

我正在使用它来查看文本框是否滚动到最后,如下所示:

public static bool IsScrolledToEnd(this TextBox textBox)
{
    return textBox.VerticalOffset + textBox.ViewportHeight == textBox.ExtentHeight;
}
Run Code Online (Sandbox Code Playgroud)

  • 约翰,谢谢,我已经尝试过您的IsScrolledToEnd。它通常有效,但并非总是如此。问题是您正在将双精度数与==运算符进行比较。我认为在此比较中应该有1行公差,例如:`bool scrollToEnd = Memo.VerticalOffset> Memo.ExtentHeight-Memo.ViewportHeight-fontHeight;` (2认同)