Я загружаю довольно много форматированного текста в 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
снова терпит неудачу.
EDIT 2: после ответа dowhilefor: MSDN на InvalidateArrange говорит
После аннулирования макет элемента будет обновлен, что будет происходить асинхронно, если впоследствии не будет принудительно выполнено с помощью UpdateLayout.
Но даже
richTextBox.InvalidateArrange();
richTextBox.InvalidateMeasure();
richTextBox.UpdateLayout();
НЕ ждет: после этих вызовов richtextbox все еще добавляет больше текста и размещает его внутри себя асинхронно. АРГ!