我正在将大量富文本加载到RichTextBox
(WPF)中,并且我想滚动到内容的末尾:
richTextBox.Document.Blocks.Add(...)
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();
这不起作用,ScrollToEnd
在布局未完成时执行,因此它不会滚动到最后,它会滚动到文本的前三分之一左右。
有没有办法强制等待,直到RichTextBox
完成其绘画和布局操作,以便ScrollToEnd
实际滚动到文本的末尾?
谢谢。
不起作用的东西:
编辑:我已经尝试过该LayoutUpdated
事件,但它立即被触发,同样的问题:当它被触发时,控件仍然在 Richtextbox 内布置更多文本,所以即使ScrollToEnd
没有工作......我试过这个:
richTextBox.Document.Blocks.Add(...)
richTextBoxLayoutChanged = true;
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();
并在richTextBox.LayoutUpdated
事件处理程序内部:
if (richTextBoxLayoutChanged)
{
richTextBoxLayoutChanged = false;
richTextBox.ScrollToEnd();
}
该事件被正确触发但太快了,richtextbox 在触发时仍在添加更多文本,布局未完成因此ScrollToEnd
再次失败。
编辑 2:遵循 dowhilefor 的回答:InvalidateArrange 上的 MSDN 说
失效后,元素将更新其布局,这将异步发生,除非随后被 UpdateLayout 强制。
然而即使
richTextBox.InvalidateArrange();
richTextBox.InvalidateMeasure();
richTextBox.UpdateLayout();
不等待:在这些调用之后,richtextbox 仍在添加更多文本并将其异步放置在自身内部。啊!