(WPF)にかなりの量のリッチ テキストを読み込んでRichTextBox
おり、コンテンツの最後までスクロールしたい:
richTextBox.Document.Blocks.Add(...)
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();
これは機能せずScrollToEnd
、レイアウトが終了していないときに実行されるため、最後までスクロールせず、テキストの最初の 3 分の 1 程度までスクロールします。
実際にテキストの最後までスクロールするRichTextBox
ように、ペイントとレイアウト操作が完了するまで強制的に待機させる方法はありますか?ScrollToEnd
ありがとう。
動作しないもの:
編集:LayoutUpdated
イベントを試してみましたが、すぐに発生します。同じ問題: コントロールは、起動時にリッチテキストボックス内にさらにテキストを配置しているため、ScrollToEnd
機能しません... 私はこれを試しました:
richTextBox.Document.Blocks.Add(...)
richTextBoxLayoutChanged = true;
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();
そしてrichTextBox.LayoutUpdated
イベントハンドラー内:
if (richTextBoxLayoutChanged)
{
richTextBoxLayoutChanged = false;
richTextBox.ScrollToEnd();
}
イベントは正しく発生しますが、すぐにリッチテキストボックスが発生したときにまだテキストを追加しているため、レイアウトが完了していないため、ScrollToEnd
再び失敗します。
EDIT 2:dowhileforの答えに続いて:InvalidateArrangeのMSDNは言う
無効化の後、要素のレイアウトが更新されます。これは、後で UpdateLayout によって強制されない限り、非同期に発生します。
それでも
richTextBox.InvalidateArrange();
richTextBox.InvalidateMeasure();
richTextBox.UpdateLayout();
待機しません: これらの呼び出しの後、richtextbox はさらにテキストを追加し、それを内部に非同期的に配置しています。ARG!