RichTextBox 滚动结束不可见时不工作

RichTextBox scroll to end not working when not visible

我的应用程序中有一个位于网格中的 WPF RichTextBox。它会在显示日志时每隔一两秒更新一次(尽管有时根据负载的不同,最多一分钟没有日志)。

网格并不总是可见的,因为它位于自己的选项卡中。如果用户在另一个选项卡上,则记录器不可见。

我的问题是每次添加新段落时我都希望 RichTextBox 滚动到末尾。这看起来很简单,因为 RichTextBox 控件上有一个 'ScrollToEnd' 方法,所以每次将文本添加到控件时我都会调用该方法。

问题是该方法仅在控件可见时才有效,如果用户在另一个选项卡上,RichTextBox 将不会滚动到末尾,当您使用记录器单击选项卡并在之后单击时,它看起来很奇怪几秒钟或更长时间它应该已经在底部时滚动到底部。

有没有办法绕过这个恼人的 "feature" 控件?我希望始终将 RichTextBox 置于底部,除非用户手动控制滚动条。

谢谢!

您是否有理由不能简单地调用 ScrollToEnd 来响应文本框变得可见?这似乎是最简单的方法。您尝试过后 运行 遇到问题了吗?

编辑:如果您使用 TabControl,每个 TabItem 都有一个 IsSelected 属性,您可以从 ItemContainerStyle 绑定到。您可能可以滚动文本框以响应选项卡被选中。


单独说明:如果您打算为此制作自定义控件,请考虑以下事项。

我写了一个 FlowDocumentScrollViewer 的自动滚动版本。 (我从未特别需要 RichTextBox,但它们显示的内容相似。)我可以告诉你,有很多事情需要考虑,例如知道何时以及何时不根据用户的内容自动滚动目前正在做。

例如:

  • 如果用户通过滚动条或鼠标滚轮自己接管滚动,您不希望控件与他们冲突。
  • 如果他们开始选择文本,您不希望在选择过程中将其滚动远离他们。
  • 如果它们滚动到底部,您可能希望它再次开始自动滚动。

此外,确定用户开始做什么有时本身就是一个复杂的过程。

默认情况下,TabControl 实际上不会更改其内容的可见性,它会在您更改选项卡时将它们从视图中完全删除,然后 "re-attachs" 在您导航回上一个选项卡时将它们删除。

这就是未触发可见性更改的原因。相反,您应该处理 Loaded 事件,该事件应该在重新呈现视图之前立即触发。