none
如何计算richtextbox中插入的元素高度 RRS feed

  • 问题

  • 在richtextbox中,插入了一系列元素,这些元素都包含在table的一个cell中,其中有图片和文字(paragragh或者inline形式)

    在位置输入元素高度的情况下,有没有办法计算出每个cell里,内容的总高度呢

    2016年5月10日 3:39

全部回复

  • 没有人算过么,,
    2016年5月11日 5:04
  • 您好 wpf萌新,

    >>"在位置输入元素高度的情况下,有没有办法计算出每个cell里,内容的总高度呢"

    WPF的流文档仅仅是对数据的描述,所以这些标签上面也没有类似Height或Width这些属性。所以我们没有办法通过流文档的对象来获得他们的高度。只有当流文档被放入某个控件上被显示的时候,才会被父容器动态的计算高度和宽度并放置好位置。所以替代性解决方案是把您需要计算的cell中的所有内容放入一个RichTextBox中,并设置RichTextBox的宽度和您当前cell所占的宽度相同,那么这个新的RichTextBox的高度就是您的cell的高度。以下代码供你参考。

    private double GetFlowDocumentHeight(string document, double width)
    {
        ParserContext context = new ParserContext();
        context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
    
        var paragraph = XamlReader.Parse(document, context);
        var flowDoc = new FlowDocument();
        flowDoc.Blocks.Add((Paragraph)paragraph);
    
        var richtextbox = new RichTextBox { Width = width, 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;
    }

    这里你需要传入两个值,一个是cell内的流文档,第二个是cell所占的宽度。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年5月12日 5:48
  • 嗨,王,我的主要目的其实是计算richtextbox的垂直滚动条位置

    比如我的滚动条在richtextbox最上边,然后从队列头插入10个paragragh

    这个时候需要设置scrollbar的当前位置到第一个插入的位置,用户从后往前拖就可以看到所有加载的数据。

    目前一个paragraph里面包含有多个cell,你提供的那个方法可能不太好弄

    2016年5月12日 6:43
  • 您好 wpf萌新,

    是的,我提供的那个方法只适合简单的计算。你的这个场景适合不适合外层套一个大的RichTextBox,还是建议您把你的控件进行细分。比如显示聊天记录可以用一个集合控件。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年5月14日 9:57
  • 我确实是吧一条聊天记录抽象成了一个控件集合,由多个paragraphs和table等构成,你的意思是可以把多个这样的条目一起放入一个viewbox中计算高度么

    我仿照你的方法,但好像的不出正确结果,每次viewbox的高度 宽度都是一样的,代码如下

     var richtextbox = new RichTextBox();
                    richtextbox.Document.Blocks.Add(msg2DSP.getMessageItem());
                    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 };

    2016年5月14日 18:35
  • 您好 wpf萌新,

    >>"我仿照你的方法,但好像的不出正确结果,每次viewbox的高度 宽度都是一样的"

    既然这个方法在您的场景中不适用,那我们来换一种解决方法。既然我们要计算新插入的内容高度,那我们可以通过插入后的RichTextBox的总高度减去插入前RichTextBox的总高度。这需要我们在插入内容前先用一个变量来存储之前的高度。

    double exHeight = rtb.ExtentHeight;

    然后在插入新的内容后执行以下代码来计算新内容的高度。

    double newlineHeight = rtb.ExtentHeight - exHeight;
    Best Regards,
    Li Wang

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年5月19日 3:29
  • var b = new Image
                {
                    Source = new BitmapImage(new Uri("pack://application:,,,/" + "office.jpg", UriKind.RelativeOrAbsolute)),
                    Width = 30,
                    Height = 30,
                    Tag = "pack://application:,,,/" + "office.jpg"
                };
    
                Figure pf = new Figure();
                pf.HorizontalAnchor = FigureHorizontalAnchor.PageLeft;
                pf.Margin = new Thickness(1, 0, 0, 0);
    
                Paragraph pTemp = new Paragraph();
    
                pTemp.TextAlignment = TextAlignment.Left;
                pTemp.Inlines.Add(new Run("aaaaaa") { Background = Brushes.Red });
                pTemp.Inlines.Add(new InlineUIContainer(b) { BaselineAlignment = BaselineAlignment.Top });
                //          pTemp.Inlines.Add(new InlineUIContainer(CreateBorder()));
    
                pf.Blocks.Add(pTemp);
    
                RichTextBox rTB = new RichTextBox();
                rTB.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
                rTB.Document.Blocks.Add(new Paragraph(pf));
                double dWidth = rTB.ExtentWidth;
                double dHeight = rTB.ExtentHeight;
    
                double dV = rTB.VerticalOffset;
    王,我做了实验,为啥得出来的全是0啊,头都要扣爆了
    2016年5月19日 14:04
  • 您好 wpf萌新,

    看到了您发的新帖,我们会在您的新帖里继续关注您的问题,建议您把对您有帮助的回复标记为答案。谢谢。
    https://social.msdn.microsoft.com/Forums/zh-CN/27544cef-9a0b-4905-8af0-25bef14d57f7/richetextboxflowdocument?forum=wpfzhchs

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年5月23日 6:37