wpf, c #, получить реальную высоту элемента при добавлении дочерних элементов в цикле - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно добавить блоки (абзацы) в FlowDocument и остановиться при достижении определенной высоты:

        FlowDocumentScrollViewer fld = new FlowDocumentScrollViewer();
        fld.Document = new FlowDocument();
        for (int i = 1; i < 10; i++)
        {
            Paragraph p1 = new Paragraph(new Run("Calling this method has no effect if layout is unchanged, or if neither arrangement nor measurement state of a layout is invalid."));
            fld.Document.Blocks.Add(p1);
            fld.Arrange(new Rect(0, 0, 0, 0));
            fld.UpdateLayout();
            fld.Arrange(new Rect(0, 0, 0, 0));
            System.Windows.Size msize = fld.RenderSize;
            if (msize.Height > 400)
                break;
        }

Теперь мои вопросы: Как я могу получить реальный или визуализированный размер FlowDocumentScrollViewerв петле?Процесс рендеринга не запускается, пока цикл не закончится.Но мне нужна высота, чтобы закончить цикл.UpdateLayout (), кажется, не делает работу.Кто-нибудь знает, как получить визуализированную высоту?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я нашел решение:

fld.Document.Blocks.Add(p1);
fld.Measure(new System.Windows.Size(Double.PositiveInfinity, Double.PositiveInfinity));
fld.Arrange(new Rect(new System.Windows.Point(0, 0), fld.DesiredSize));
fld.UpdateLayout();

Нужно вызвать именно эти методы.Измерение с Double.PositiveInfinity важно и в дальнейшем Аранжируйте с DesiredSize.Затем ActualHeight обновляется и имеет правильное значение.

0 голосов
/ 05 февраля 2019

Попробуйте:

fld.ActualHeight

"Получить визуализированную высоту этого элемента."

Microsoft о ActualHeight

Но как автор и MSговорит, что ActualHeight «заполняется» после визуализации.С не бывает в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...