Witam.
Ostatnie zauważyłem problem w moim kodzie, związany ze stronicowaniem wydruku FlowDocument.
W dokumencie zdefiniowana jest tabela <Table>, która zawiera nagłówek zdefiniowany w pierwszym <TableRowGroup> oraz poszczególne wiersze <TableRow> zawarte w drugim <TableRowGroup>.
Do wydruku używam własnego paginatora, w którym na każdej stronie powtarzam nagłówek zawarty w pierwszym <TableRowGroup>.
Problem polega na tym, że metoda zwracająca położenie dolnej krawędzi <TableRow> (zadeklarowana w tym paginatorze) nie działa prawidłowo gdy wiersze mają różną wysokość. Po prostu nie zwraca prawidłowej wartości poszczególnych wierszy, przez co wydruk wyjeżdża poza stronę (nie jest ucinany na odpowiednim wierszu). Jeżeli wiersze mają taką samą wysokość to nie ma problemu.
Wiersze mogą być różnej wysokości ze względu na zwijanie zawartości kolumn (np. druga kolumna może zawierać długie nazwy i wtedy są one zawijane). Wywołanie tej metody wykonywane jest w konstruktorze paginatora.

Definicja metody zwracającej położenie dolnej krawędzi wiersza:

public static double GetLowerBound(this TableRow row)
{
    return row.ContentEnd.GetCharacterRect(LogicalDirection.Forward).Bottom + 3;
}

Kod był napisany pod frameworkiem 4.0. Jakiś czas temu przeszedłem na framework'a 4.8. Nie wiem czy to jest przyczyną problemu. Do tej pory nie zaobserwowałem tego problemu.
Czy ktoś może ma jakiś pomysł jak prawidłowo zwrócić położenie wiersza we FlowDocument?

Nie za bardzo również rozumiem też właściwości TableRow ContentEnd oraz ContentStart. Z opisu wynika, że powinny to być pierwszy i ostatni element zawarty w wierszu, czyli w moim przypadku <TableCell>. Ale gdy próbuję przeszukać całą zawartość wiersza:

public static double GetLowerBound(this TableRow row)
{
    double result = 0;
    TextPointer p = row.ContentStart;
    while (p != null)
    {
        if (p.GetCharacterRect(LogicalDirection.Forward).Bottom > result)
            result = p.GetCharacterRect(LogicalDirection.Forward).Bottom;

        p = p.GetNextContextPosition(LogicalDirection.Forward);
    }
    return result + 3;
}

to metoda zapętla mi się (nie chce długo wyjść z pętli).
Czy ktoś może mi wytłumaczyć dlaczego?

Przykładowa zawartość FlowDocument:

<FlowDocument AllowDrop="True" NumberSubstitution.CultureSource="User" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
FontFamily="Arial Unicode MS CE" FontSize="14.6666666666667">


    <Table FontSize="12" CellSpacing="0" Margin="0,24,0,0">
        <Table.Columns>
            <TableColumn Width="1cm"/>
            <TableColumn Width="Auto"/>
            <TableColumn Width="1.8cm"/>
            <TableColumn Width="1.8cm"/>
            <TableColumn Width="1.8cm"/>
            <TableColumn Width="1.2cm"/>
            <TableColumn Width="1.5cm"/>
            <TableColumn Width="1.6cm"/>
            <TableColumn Width="2cm"/>
            <TableColumn Width="2cm"/>
        </Table.Columns>
        <TableRowGroup >
            <TableRow FontWeight="Bold" TextBlock.TextAlignment="Center">
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,20,0,12">
                        <Span>Lp.</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,20,0,12">
                        <Span>Nazwa</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,12,0,6">
                        <Span>Ilość wyliczona</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,12,0,6">
                        <Span>Ilość
                            <LineBreak/> spisana
                        </Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,12,0,6">
                        <Span>Różnica
                            <LineBreak/>ilości
                        </Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,20,0,12">
                        <Span>JM
                        </Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,20,0,12">
                        <Span>Błąd %
                        </Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,6,0,6">
                        <Span>Cena<LineBreak/>brutto<LineBreak/>przyjęcia</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="0,6,0,6">
                        <Span>Wartość brutto<LineBreak/>przed inw.</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,1,0" BorderBrush="Black">
                    <Paragraph Margin="0,6,0,6">
                        <Span>Wartość brutto<LineBreak/>po inwent.</Span>
                    </Paragraph>
                </TableCell>
            </TableRow>
        </TableRowGroup>
        <TableRowGroup>
           
            <TableRow>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>1</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" FontWeight="Bold">
                        <Span>Albarino PACO LOLA</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>15</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>14.25</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>-0.75</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Center">
                        <Span>l</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>5.26%</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span></Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>1236.83</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,1,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>1174.98</Span>
                    </Paragraph>
                </TableCell>
            </TableRow>
           
            
            <TableRow>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>2</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" FontWeight="Bold">
                        <Span>Amarone SPERI DUSHESSA LIA</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>5.25</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>5.25</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>0</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Center">
                        <Span>l</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>0%</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span></Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,0,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>1637.71</Span>
                    </Paragraph>
                </TableCell>
                <TableCell BorderThickness="1,1,1,0" BorderBrush="Black">
                    <Paragraph Margin="4,2" TextAlignment="Right">
                        <Span>1637.71</Span>
                    </Paragraph>
                </TableCell>
            </TableRow>
        </TableRowGroup>
    </Table>

</FlowDocument>

Z głębszej analizy kodu wyszło mi, że problemem jest to, że w momencie sprawdzania przez paginatora dokumentu wiersze, które mają zawiniętą treść nie są jeszcze rozszerzone. Może stąd wynika problem? Próbowałem wywołać dzielenie na strony w momencie pierwszego wywołania właściwości IsPageCountValid ale to nie pomogło. Czy idę dobrym tropem?