I want to detect (preferably through an event) when any content is added, changed, etc. in a FlowDocument and when it does I want to cause a FlowDocumentScrollViewer displaying the FlowDocument to automatically scroll to the end.
I want to detect (preferably through an event) when any content is added, changed,
Share
You can detect changes in the
FlowDocumentby creating a text range and monitoring it for changes. Scrolling to the bottom is more difficult because you have to find theScrollViewer. Also for performance you don’t want redo all the scrolling calculations on every change, so you should useDispatcherOperations.Putting it all together, this code should do the trick:
where
FindFirstVisualDescendantOfTypeis a simple depth-first prefix search of the visual tree usingVisualTreeHelper.GetChildrenCount()andVisualTreeHelper.GetChild()and returning the first Visual found of the specified type.Note that for full generality I don’t precompute scrollViewer at the top of the code because the
FlowDocumentScrollViewer‘s template can change. If this won’t happen, this code can be speeded up by calling.ApplyTemplate()on theFlowDocumentScrollViewerand then computingscrollViewerbefore the event handler is registered:Note that we cannot simply call
scrollViewer.GetTemplateChild("PART_ContentHost")and skip the visual tree search becauseGetTemplateChildis protected.