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

Wpf RichTextBox滚动到不可见时结束不工作,wpf,wpf-controls,scrollbar,richtextbox,vertical-scrolling,Wpf,Wpf Controls,Scrollbar,Richtextbox,Vertical Scrolling,我的应用程序中有一个位于网格中的WPF RichTextBox。它在显示日志时每隔一两秒就会更新一次(尽管有时根据负载情况,一分钟内没有日志) 网格并不总是可见的,因为它位于自己的选项卡中。如果用户位于另一个选项卡上,则记录器不可见 我的问题是,每次添加新段落时,我都希望RichTextBox滚动到末尾。它看起来很简单,因为RichTextBox控件上有一个“ScrollToEnd”方法,所以每次文本添加到控件时,我都会调用该方法 问题是,该方法仅在控件可见的情况下有效,如果用户位于另一个选项卡

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

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

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

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

有没有办法绕过这个讨厌的控件“特性”?我希望RichTextBox始终位于底部,除非用户手动控制滚动条


谢谢

当文本框变为可见时,有什么原因不能简单地调用
ScrollToEnd
?这似乎是最简单的方法。你有没有试过并遇到问题


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


作为单独的注释:如果你打算为这个做自定义控件,这里有一些要考虑的事情。

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

例如:

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

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

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


这就是为什么可见性更改不会被触发。相反,您应该处理加载的事件,该事件应该在视图重新渲染之前立即触发。

我尝试挂接可见的更改事件,但当用户转到其他选项卡并返回时,该事件变为可见时未触发。我尝试了那里的每个事件,但找不到一个总是在事件再次可见/渲染时触发的事件。我不想做一个自定义控件,它更多的是“如果我有太多”之类的东西。我更希望找到另一种解决方案,允许我使用当前控件。如果您使用的是
TabControl
,则每个
TabItem
都有一个属性,您可以从
ItemContainerStyle
绑定到该属性。您可能会滚动文本框以响应选项卡被选中。我们使用类似的功能,不是常规的TabItem/TabControl,而是足够近的功能。这确实给了我一个好主意,让我尝试一些我以前从未想过的东西。如果行得通,我会接受你的回答。答案是它自己,即使它不是我的确切解决方案,我认为它仍然是其他人将来可以使用/看到的一个很好的答案。这完美地解决了我的问题,现在我已经迷上了加载的事件,一切都是完美的!我不敢相信我从来没有想到过这一点,我假设它会改变可见性,而不会被删除和添加。赏金奖励。这很违反直觉,也没有很好的记录:P我们也发现了困难的方法,经过大量的尝试和错误,最后求助于Snoop来检查视觉树-发现每次只呈现一个TabItem的内容!(谢谢你的赏金:)