Дождитесь завершения макета элемента управления

Я загружаю довольно много форматированного текста в RichTextBox (WPF) и хочу прокрутить до конца содержимого:

richTextBox.Document.Blocks.Add(...)
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();

Это не работает, ScrollToEnd выполняется, когда макет не завершен, поэтому он не прокручивается до конца, он прокручивается примерно до первой трети текста.

Есть ли способ принудительно подождать до RichTextBox завершил операции рисования и компоновки, так что ScrollToEnd действительно прокручивается до конца текста?

Спасибо.

Что-то не работает:

EDIT ]: Я пробовал событие 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: MSDN на InvalidateArrange говорит

После признания недействительности макета элемента будет обновлена, что приведет к происходят асинхронно, если впоследствии не принудительно UpdateLayout.

Однако даже

richTextBox.InvalidateArrange();
richTextBox.InvalidateMeasure();
richTextBox.UpdateLayout();

НЕ ждет: после этих вызовов richtextbox все еще добавляет текст и асинхронно размещает его внутри себя. ARG!

9
задан Contango 16 May 2016 в 15:57
поделиться