Зареждам доста богат текст в RichTextBox
(WPF) и искам да превъртя до края на съдържанието:
richTextBox.Document.Blocks.Add(...)
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();
Това не работи, ScrollToEnd
се изпълнява, когато оформлението не е завършено, така че не се превърта до края, а се превърта до около първата трета от текста.
Има ли начин да принудите да изчакате, докато RichTextBox
завърши своите операции по рисуване и оформление, така че ScrollToEnd
действително да превърти до края на текста?
Благодаря.
Неща, които не работят:
РЕДАКТИРАНЕ: Опитах събитието LayoutUpdated
, но то се задейства веднага, същият проблем: контролата все още излага повече текст вътре в полето с богат текст, когато се задейства, така че дори 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!