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

时间:2015-05-23 21:44:55

标签: wpf wpf-controls scrollbar richtextbox vertical-scrolling

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

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

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

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

有没有办法解决这个烦人的“控制功能”?除非用户手动控制滚动条,否则我总是希望RichTextBox位于底部。

谢谢!

2 个答案:

答案 0 :(得分:3)

默认情况下,TabControl实际上不会更改其内容可见性,当您更改选项卡时会将其从视图中完全删除,然后在导航回上一个选项卡时“重新附加”它们。

这就是Visibility改变不会被解雇的原因。相反,您应该处理已加载事件,该事件应在重新呈现视图之前被触发。

答案 1 :(得分:1)

是否有理由不能简单地调用ScrollToEnd以响应文本框变得可见?这似乎是最简单的方法。你试过它并遇到问题吗?

修改:如果您使用的是TabControl,则每个TabItem都有一个IsSelected属性,您可以从ItemContainerStyle绑定该属性。您可以滚动文本框以响应选项卡的选择。

另外注意:如果您打算为此制作自定义控件,请考虑以下事项。

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

例如:

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

此外,确定用户开始做的事情有时可能是一个复杂的过程。

相关问题