wpf 如何获得段落或段落的高度

uqcuzwp8  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(182)

我在FlowDocument中找到了RunParagraph,现在我需要知道它的高度

while (navigator.CompareTo(flowDocViewer.Document.ContentEnd) < 0)
  {
      TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward);
      Run run = navigator.Parent as Run;
      // I need to get HEIGHT of Run in pixels somehow

事实上有可能做到吗?

谢谢大家!

mwngjboj

mwngjboj1#

我正在使用的一个小函数。输入是一个包含Section的字符串。您可以轻松地渲染其他块元素,如Paragraph。
还可以省略Parse方法的第二个参数。
诀窍是不测量段落,但包含RichTextBox的ViewBox。这是实际渲染Flowdocument所需的。ViewBox动态获取rtb的大小。也许你甚至可以在没有ViewBox的情况下做到这一点。我花了一些时间来弄清楚这一点,它对我很有效。
请注意,RichTextBoxWidth被设置为double.MaxValue。这意味着当你想测量一个段落时,它必须很长或者所有内容都在一行中。所以只有当你知道输出设备的宽度时,这才有意义。因为这是一个FlowDocument,没有宽度,它流动;)我用这个来给一个FlowDocument分页,在那里我知道纸张大小。
返回的高度是独立于设备的单位。

private double GetHeaderFooterHeight(string headerFooter)
        {

            var section = (Section)XamlReader.Parse(headerFooter, _pd.ParserContext);
            var flowDoc = new FlowDocument();
            flowDoc.Blocks.Add(section);

            var richtextbox = new RichTextBox { Width = double.MaxValue, Document = flowDoc };
            var viewbox = new Viewbox { Child = richtextbox };

            viewbox.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            viewbox.Arrange(new Rect(viewbox.DesiredSize));

            var size = new Size() { Height = viewbox.ActualHeight, Width = viewbox.ActualWidth };

            return size.Height;
        }
ewm0tg9j

ewm0tg9j2#

这对我很有效:

Rect start = run.ElementStart.GetCharacterRect(LogicalDirection.Forward);
Rect end = run.ElementEnd.GetCharacterRect(LogicalDirection.Forward);

// Do math with start and end

在我的例子中,我的Run都以换行符结束,所以我可以从start.Topend.Top进行测量,但您可能需要检查end.Bottom

相关问题