I have multiple section in FlowDocument as follows. Since there are multiple blocks inside FlowDocument and FlowDocument is inside FlowDocumentScrollViewer the content can be scrolled. Here, I am trying to detect the block that is currently visible in view. For example in following image <Section Name="sec2"> ... </Section> is visible.
MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<FlowDocumentScrollViewer IsToolBarVisible="False" MinZoom="50" Zoom="100" BorderThickness="1" BorderBrush="Gainsboro" Name="flowDoc" Loaded="FlowDoc_Loaded">
<FlowDocument Name="flowdoc1" ColumnWidth="999999" PageHeight="840">
<Section Name="sec1">
<Paragraph>
<Run>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum nec maximus libero. Proin at suscipit tellus. Maecenas interdum lacinia turpis, nec dictum nisi blandit ac. Mauris quis mauris sodales, aliquet tortor nec, dignissim turpis. Sed nec purus vitae tortor posuere tempus id at justo. Integer maximus, eros sit amet sollicitudin cursus, urna lacus posuere justo, ut tempus est nisi nec elit. Duis luctus, justo sed feugiat dapibus, arcu odio hendrerit est, tempus tempus ante elit ut augue. Quisque aliquet blandit libero sed congue. Quisque imperdiet tempor enim, at pulvinar nulla pellentesque in. Maecenas sit amet massa ultrices, fringilla leo id, scelerisque turpis. Cras non pharetra metus. Cras blandit hendrerit nulla at pellentesque. Nulla tristique eget nibh sed ornare. Praesent augue purus, tincidunt a tempus ut, iaculis vel mi.
</Run>
<Run>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent molestie volutpat ante, ac dapibus risus varius vel. In tempor nulla non tristique scelerisque. Nam sollicitudin est tellus, sit amet tempus quam faucibus vel. Proin accumsan sed est ut facilisis. Sed non elit semper, euismod augue non, vulputate lorem. Duis malesuada fringilla mauris, ut tempus enim volutpat in. Duis dignissim ullamcorper est in auctor. Nam at tempor metus, in blandit ligula. Mauris sed urna eleifend, volutpat nulla at, ornare libero. Pellentesque dictum ac nibh at fringilla. Pellentesque eu mi leo. Proin aliquet ante at nisi consequat pharetra.
</Run>
<Run>
Etiam accumsan arcu justo, quis dignissim elit volutpat id. Maecenas nec eros id massa pellentesque euismod nec et libero. Aliquam in porttitor lectus. Mauris nec magna sit amet mauris dignissim blandit eget eget velit. Vestibulum dapibus tempor erat, in dapibus eros vestibulum venenatis. Aenean massa mi, efficitur quis fringilla in, elementum vel metus. Sed pulvinar ex lacinia lobortis pharetra. In vel nisi aliquet, porttitor purus vitae, tempus orci. Morbi et ipsum rhoncus, aliquam tortor et, iaculis nibh.
</Run>
<Run>
Curabitur hendrerit nisl ut erat viverra pharetra. Fusce rhoncus vitae nisl ac venenatis. Etiam eget magna vitae dolor placerat vestibulum. Maecenas et tristique orci, et molestie risus. In consectetur odio mi, at sollicitudin mauris aliquam in. Aenean a est vehicula lectus semper tempus id sed diam. Suspendisse potenti. Donec accumsan tortor ac lobortis hendrerit. Phasellus vel pellentesque tortor. Curabitur consectetur luctus nibh, non interdum orci placerat in. Pellentesque tempus est tellus, sit amet tempor eros rhoncus vitae. Nunc lobortis turpis sed condimentum mattis. Aliquam erat volutpat.
</Run>
<Run>
Proin ut pellentesque felis. Curabitur faucibus sed lectus id ornare. Suspendisse tempor pellentesque quam sit amet gravida. Sed venenatis lorem sit amet metus luctus efficitur. Ut enim nisl, luctus quis mollis vitae, aliquam in est. Donec et lobortis sapien. Aliquam suscipit augue a nunc tincidunt, vel sodales velit dapibus. Nulla lacinia mi sit amet libero scelerisque, at hendrerit eros vehicula. Nam lectus metus, faucibus non quam eu, dignissim ultrices metus. Cras urna libero, molestie euismod tortor id, ultrices posuere ligula. Nulla porta maximus nulla. Nunc vitae finibus diam, eu consequat tortor.
</Run>
</Paragraph>
</Section>
<Section Name="sec2">
<Paragraph>
<Run>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum nec maximus libero. Proin at suscipit tellus. Maecenas interdum lacinia turpis, nec dictum nisi blandit ac. Mauris quis mauris sodales, aliquet tortor nec, dignissim turpis. Sed nec purus vitae tortor posuere tempus id at justo. Integer maximus, eros sit amet sollicitudin cursus, urna lacus posuere justo, ut tempus est nisi nec elit. Duis luctus, justo sed feugiat dapibus, arcu odio hendrerit est, tempus tempus ante elit ut augue. Quisque aliquet blandit libero sed congue. Quisque imperdiet tempor enim, at pulvinar nulla pellentesque in. Maecenas sit amet massa ultrices, fringilla leo id, scelerisque turpis. Cras non pharetra metus. Cras blandit hendrerit nulla at pellentesque. Nulla tristique eget nibh sed ornare. Praesent augue purus, tincidunt a tempus ut, iaculis vel mi.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent molestie volutpat ante, ac dapibus risus varius vel. In tempor nulla non tristique scelerisque. Nam sollicitudin est tellus, sit amet tempus quam faucibus vel. Proin accumsan sed est ut facilisis. Sed non elit semper, euismod augue non, vulputate lorem. Duis malesuada fringilla mauris, ut tempus enim volutpat in. Duis dignissim ullamcorper est in auctor. Nam at tempor metus, in blandit ligula. Mauris sed urna eleifend, volutpat nulla at, ornare libero. Pellentesque dictum ac nibh at fringilla. Pellentesque eu mi leo. Proin aliquet ante at nisi consequat pharetra.
Etiam accumsan arcu justo, quis dignissim elit volutpat id. Maecenas nec eros id massa pellentesque euismod nec et libero. Aliquam in porttitor lectus. Mauris nec magna sit amet mauris dignissim blandit eget eget velit. Vestibulum dapibus tempor erat, in dapibus eros vestibulum venenatis. Aenean massa mi, efficitur quis fringilla in, elementum vel metus. Sed pulvinar ex lacinia lobortis pharetra. In vel nisi aliquet, porttitor purus vitae, tempus orci. Morbi et ipsum rhoncus, aliquam tortor et, iaculis nibh.
Curabitur hendrerit nisl ut erat viverra pharetra. Fusce rhoncus vitae nisl ac venenatis. Etiam eget magna vitae dolor placerat vestibulum. Maecenas et tristique orci, et molestie risus. In consectetur odio mi, at sollicitudin mauris aliquam in. Aenean a est vehicula lectus semper tempus id sed diam. Suspendisse potenti. Donec accumsan tortor ac lobortis hendrerit. Phasellus vel pellentesque tortor. Curabitur consectetur luctus nibh, non interdum orci placerat in. Pellentesque tempus est tellus, sit amet tempor eros rhoncus vitae. Nunc lobortis turpis sed condimentum mattis. Aliquam erat volutpat.
Proin ut pellentesque felis. Curabitur faucibus sed lectus id ornare. Suspendisse tempor pellentesque quam sit amet gravida. Sed venenatis lorem sit amet metus luctus efficitur. Ut enim nisl, luctus quis mollis vitae, aliquam in est. Donec et lobortis sapien. Aliquam suscipit augue a nunc tincidunt, vel sodales velit dapibus. Nulla lacinia mi sit amet libero scelerisque, at hendrerit eros vehicula. Nam lectus metus, faucibus non quam eu, dignissim ultrices metus. Cras urna libero, molestie euismod tortor id, ultrices posuere ligula. Nulla porta maximus nulla. Nunc vitae finibus diam, eu consequat tortor.
</Run>
</Paragraph>
</Section>
<Section Name="sec3">
<Paragraph>
<Run>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum nec maximus libero. Proin at suscipit tellus. Maecenas interdum lacinia turpis, nec dictum nisi blandit ac. Mauris quis mauris sodales, aliquet tortor nec, dignissim turpis. Sed nec purus vitae tortor posuere tempus id at justo. Integer maximus, eros sit amet sollicitudin cursus, urna lacus posuere justo, ut tempus est nisi nec elit. Duis luctus, justo sed feugiat dapibus, arcu odio hendrerit est, tempus tempus ante elit ut augue. Quisque aliquet blandit libero sed congue. Quisque imperdiet tempor enim, at pulvinar nulla pellentesque in. Maecenas sit amet massa ultrices, fringilla leo id, scelerisque turpis. Cras non pharetra metus. Cras blandit hendrerit nulla at pellentesque. Nulla tristique eget nibh sed ornare. Praesent augue purus, tincidunt a tempus ut, iaculis vel mi.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent molestie volutpat ante, ac dapibus risus varius vel. In tempor nulla non tristique scelerisque. Nam sollicitudin est tellus, sit amet tempus quam faucibus vel. Proin accumsan sed est ut facilisis. Sed non elit semper, euismod augue non, vulputate lorem. Duis malesuada fringilla mauris, ut tempus enim volutpat in. Duis dignissim ullamcorper est in auctor. Nam at tempor metus, in blandit ligula. Mauris sed urna eleifend, volutpat nulla at, ornare libero. Pellentesque dictum ac nibh at fringilla. Pellentesque eu mi leo. Proin aliquet ante at nisi consequat pharetra.
Etiam accumsan arcu justo, quis dignissim elit volutpat id. Maecenas nec eros id massa pellentesque euismod nec et libero. Aliquam in porttitor lectus. Mauris nec magna sit amet mauris dignissim blandit eget eget velit. Vestibulum dapibus tempor erat, in dapibus eros vestibulum venenatis. Aenean massa mi, efficitur quis fringilla in, elementum vel metus. Sed pulvinar ex lacinia lobortis pharetra. In vel nisi aliquet, porttitor purus vitae, tempus orci. Morbi et ipsum rhoncus, aliquam tortor et, iaculis nibh.
Curabitur hendrerit nisl ut erat viverra pharetra. Fusce rhoncus vitae nisl ac venenatis. Etiam eget magna vitae dolor placerat vestibulum. Maecenas et tristique orci, et molestie risus. In consectetur odio mi, at sollicitudin mauris aliquam in. Aenean a est vehicula lectus semper tempus id sed diam. Suspendisse potenti. Donec accumsan tortor ac lobortis hendrerit. Phasellus vel pellentesque tortor. Curabitur consectetur luctus nibh, non interdum orci placerat in. Pellentesque tempus est tellus, sit amet tempor eros rhoncus vitae. Nunc lobortis turpis sed condimentum mattis. Aliquam erat volutpat.
Proin ut pellentesque felis. Curabitur faucibus sed lectus id ornare. Suspendisse tempor pellentesque quam sit amet gravida. Sed venenatis lorem sit amet metus luctus efficitur. Ut enim nisl, luctus quis mollis vitae, aliquam in est. Donec et lobortis sapien. Aliquam suscipit augue a nunc tincidunt, vel sodales velit dapibus. Nulla lacinia mi sit amet libero scelerisque, at hendrerit eros vehicula. Nam lectus metus, faucibus non quam eu, dignissim ultrices metus. Cras urna libero, molestie euismod tortor id, ultrices posuere ligula. Nulla porta maximus nulla. Nunc vitae finibus diam, eu consequat tortor.
</Run>
</Paragraph>
</Section>
</FlowDocument>
</FlowDocumentScrollViewer>
</Grid>
</Window>
And on the ScrollChanged of FlowDocumentScrollViewer I am trying to get the sections that are currently visible in view. I tried the following but could not found the actual way to achieve this.
MainWindow.xaml.cs
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void FlowDoc_Loaded(object sender, RoutedEventArgs e)
{
ScrollViewer sv = flowDoc.Template.FindName("PART_ContentHost", flowDoc) as ScrollViewer;
sv.ScrollChanged += Sv_ScrollChanged;
}
private void Sv_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
var blocks1 = flowdoc1.Blocks.ToList();
foreach(var block in blocks1)
{
//block.
var cstartPoint = block.ContentStart;
var cendPoint = block.ContentEnd;
var estartPoint = block.ElementStart;
var eendPoint = block.ElementEnd;
bool isFoucsed = block.IsFocused;
//sysWindow.Rect test1 = new sysWindow.Rect(block1);
}
}
}
}
Is there any solutions for this?



You would simply have to check if the bounds obtained from
TextPointer.GetCharacterRectare within the bounds of the view port of theScrollViewer. You would track theTextElement.ContentStartandTextElement.ContentEndtext pointers to determine whether theTextElementis visible to the user or hidden.The following example recursively traverses the document's
TextElementtree and raises aTextElementScrolledIntoViewChangedevent that notifies when anyTextElementhas entered or left the view port.Usage example
Implementation
TextElementObserver.cs
TextElementScrolledIntoViewChangedEventArgs.cs
ScrollState.cs