This is a migrated thread and some comments may be shown as answers.

How to get position of last element in RadDocument in pixels?

9 Answers 245 Views
RichTextBox
This is a migrated thread and some comments may be shown as answers.
Remus
Top achievements
Rank 1
Veteran
Remus asked on 16 Apr 2020, 08:10 AM

Hi I need to scale an image so that it fills all the empty space in a page. For this I am trying to find the remaining height of the page after some elements are inserted in it. I am using the following code:

var position = new DocumentPosition(section.GetRootDocument());
position.MoveToDocumentEnd();
var pageContentHeight = section.PageSize.Height - position.Location.Y - section.PageMargin.Vertical;

 

The problem is that position.Location.Y does't return a value in pixels. For example when my page is filed with text it returns 173.8107 but the height of the page is 1056. 

How to get position of last element in RadDocument in pixels?

9 Answers, 1 is accepted

Sort by
0
Martin
Telerik team
answered on 20 Apr 2020, 02:16 PM

Hello Remus,

Instead of using this position location, I would suggest you to get the lastParagraph.LastLayoutBox.BoundingRectangle.Bottom value in order to calculate the remaining empty space on the page. Check the following code snippet: 

Paragraph lastParagraph = this.radRichTextBox.Document.EnumerateChildrenOfType<Paragraph>().Last();
float lastParagraphBoundingRectangleBottom = lastParagraph.LastLayoutBox.BoundingRectangle.Bottom;
double pageContentHeight = section.PageSize.Height - lastParagraphBoundingRectangleBottom - section.PageMargin.Bottom;

The lastParagraphBoundingRectangleBottom value includes the Section`s PageMargin.Top value, so you need to subtract only the PageMarging.Bottom.

I hope this helps. Please, let me know if there is anything else I can assist you with.

Regards,
Martin
Progress Telerik

Progress is here for your business, like always. Read more about the measures we are taking to ensure business continuity and help fight the COVID-19 pandemic.
Our thoughts here at Progress are with those affected by the outbreak.
0
Remus
Top achievements
Rank 1
Veteran
answered on 21 Apr 2020, 06:58 AM
Thank you for the response, but for some reason the bounding box of my paragraphs has all it's values set to 0. Do you have any idea why that might be?
0
Remus
Top achievements
Rank 1
Veteran
answered on 22 Apr 2020, 08:47 AM

I think that all the bounding rectangles are set to 0 because the RadDocument is not yet shown in the editor and it's in an unmeasured state.

To give a bit more context to what I am trying to do, I am generating a read only document based on a macro and that means that I can't have the RadDocument be in a measured state when I try to calculate the remaining height of a page. Is there any other method I could get the remaining height?  

0
Martin
Telerik team
answered on 23 Apr 2020, 11:17 AM

Hi Remus,

I possible solution to get the bounding rectangle size is to measure the RadDocument in an early stage (before it is passed to the editor). You can use the RadDocument`s EnsureDocumentMeasuredAndArranged() method. Check the following code snippet:

document.EnsureDocumentMeasuredAndArranged();

Paragraph lastParagraph = document.EnumerateChildrenOfType<Paragraph>().Last();
Section section = document.EnumerateChildrenOfType<Section>().Last();
float lastParagraphBoundingRectangleBottom = lastParagraph.LastLayoutBox.BoundingRectangle.Bottom;
double pageContentHeight = section.PageSize.Height - lastParagraphBoundingRectangleBottom - section.PageMargin.Bottom;

// TODO

this.radRichTextBox.Document = document;

I hope this is a solution for your case. Do not hesitate to contact us if any additional questions arise.

Regards,
Martin
Progress Telerik

Progress is here for your business, like always. Read more about the measures we are taking to ensure business continuity and help fight the COVID-19 pandemic.
Our thoughts here at Progress are with those affected by the outbreak.
0
Remus
Top achievements
Rank 1
Veteran
answered on 24 Apr 2020, 07:50 AM

Hi Martin,

Calling the EnsureDocumentMeasuredAndArranged() function did make the Bounding Rectangles to be measured, but there is still a problem: no matter how much text there is in a paragraph it's bounding rectangle has the same height, it only changes if I change the font family or size. The width dose change with the text thou.

Also the measurements on the Y axis don't reset to 0 when the text enters a new page. 

0
Remus
Top achievements
Rank 1
Veteran
answered on 24 Apr 2020, 08:34 AM

So if instead of EnsureDocumentMeasuredAndArranged() I use Measure() and Arrange() it's better, but I don't know what values are the best for the function parameters.

I tried using

section.GetRootDocument().Measure(new SizeF((float)section.PageSize.Width, (float)section.PageSize.Height));
section.GetRootDocument().Arrange(new RectangleF(0, 0, (float)section.PageSize.Width, (float)section.PageSize.Height));

but now the height is to large, can you explain a bit more what is the difference between the arrange and measure methods?

0
Remus
Top achievements
Rank 1
Veteran
answered on 27 Apr 2020, 09:55 AM

So I discovered that my radDocument before being added in to the radRichTextBox has the Layout Mode set as Flow, not Paged. After setting it's layout as Paged, EnsureDocumentMeasuredAndArranged() woks better (the width is limited to page width minus page horizontal margins, and the left and top margins are added to the X and Y values), but the value of the BoundingRectangle.Bottom is still to large and the values on the Y axis don't reset to 0 when the paragraph goes on a new page.

I have a few questions:

  1. Why are the values on the Y axis larger than the page height when the text that I have doesn't even fill a whole page?
  2. How can I calculate the remaining height of a page that is not the first page of the document? (I was thinking of subtracting the page height from BoundingRectangle.Bottom until it is lesser than the page height, but I don't know how to account for the margins.)
  3. What do Measure() and Arrange() do exactly?
0
Accepted
Martin
Telerik team
answered on 28 Apr 2020, 01:34 PM

Hi Remus,

The EnsureDocumentMeasuredAndArranged() method calls recursively the Measure() and Arrange() methods to all document children respectively. The Measure() method is measuring the DocumentLayoutBox using RadDocument.MAX_DOCUMENT_SIZE and the Arrange() method is arranging the DocumentLayoutBox using new RectangleF(PointF.Empty, this.document.DesiredSize). Check the following code snippet:

this.document.Measure(RadDocument.MAX_DOCUMENT_SIZE);
this.document.Arrange(new RectangleF(PointF.Empty, this.document.DesiredSize));

You can download and take look at our source code if you want to get more in detail on a specific part of the code.

I tried to change the LayoutMode to Paged or Flow and the result was the same. I am attaching a sample project demonstrating what I am testing. Please, feel free to modify it in a way closer to your scenario.

As for the calculation of the remaining height of a Page, you can use the Modulus operator ("%") in order to get the remainder of the division. The margins are included when you use the BoundingRectangle.Botton and you don't need to take care of them. Check the following code snippet:

double lastParagraphBoundingRectangleBottom = lastParagraph.LastLayoutBox.BoundingRectangle.Bottom % (double)section.PageSize.Height;

As for the values on the Y-axis, in order to investigate it, I need more information on how exactly this behavior is achieved or a sample project demonstrating it. 

Please, let me know if there is anything else I can assist you with.

Regards,
Martin
Progress Telerik

Progress is here for your business, like always. Read more about the measures we are taking to ensure business continuity and help fight the COVID-19 pandemic.
Our thoughts here at Progress are with those affected by the outbreak.
0
Remus
Top achievements
Rank 1
Veteran
answered on 29 Apr 2020, 07:24 AM

Hi Martin, thank you for your help!

I have figured out why the values on the Y axis were larger than expected: I was applying a stylesheet to the document later in the code and the font size changed. After applying the stylesheet before calling EnsureDocumentMeasuredAndArranged() it works as expected.

Tags
RichTextBox
Asked by
Remus
Top achievements
Rank 1
Veteran
Answers by
Martin
Telerik team
Remus
Top achievements
Rank 1
Veteran
Share this question
or