我的应用程序中有一个WPF RichTextBox,位于Grid中。它会在显示日志时每隔一两秒更新一次(尽管有时根据负载情况,最多只有一分钟没有日志)。
网格并不总是可见,因为它位于自己的标签中。如果用户在另一个选项卡上,则记录器不可见。
我的问题是,每次添加新段落时,我都希望RichTextBox滚动到末尾。看起来很简单,因为RichTextBox控件上有一个'ScrollToEnd'方法,因此每次将文本添加到控件时都会调用该方法。
问题是该方法仅在控件可见时才有效,如果用户在另一个选项卡上,则RichTextBox不会滚动到最后,当您使用记录器单击选项卡时,它看起来很奇怪当它应该已经在底部时,它会滚动到底部几秒或更长时间。
有没有办法解决这个烦人的“控制功能”?除非用户手动控制滚动条,否则我总是希望RichTextBox位于底部。
谢谢!
答案 0 :(得分:3)
默认情况下,TabControl实际上不会更改其内容可见性,当您更改选项卡时会将其从视图中完全删除,然后在导航回上一个选项卡时“重新附加”它们。
这就是Visibility改变不会被解雇的原因。相反,您应该处理已加载事件,该事件应在重新呈现视图之前被触发。
答案 1 :(得分:1)
是否有理由不能简单地调用ScrollToEnd
以响应文本框变得可见?这似乎是最简单的方法。你试过它并遇到问题吗?
修改:如果您使用的是TabControl
,则每个TabItem
都有一个IsSelected属性,您可以从ItemContainerStyle
绑定该属性。您可以滚动文本框以响应选项卡的选择。
另外注意:如果您打算为此制作自定义控件,请考虑以下事项。
我写了一个FlowDocumentScrollViewer
的自动滚动版本。 (我从来没有特别需要RichTextBox
,但它们显示的内容相似。)我可以告诉你,有很多事情需要考虑,例如知道何时何地不根据用户自动滚动目前正在做。
例如:
此外,确定用户开始做的事情有时可能是一个复杂的过程。