[Expand]General Information
[Collapse]WinForms Controls
  .NET Core Support
  Prerequisites
 [Expand]What's Installed
 [Expand]Build an Application
 [Collapse]Controls and Libraries
  [Expand]Forms and User Controls
  [Expand]Messages, Notifications, and Dialogs
  [Expand]Editors and Simple Controls
  [Expand]Ribbon, Bars and Menu
  [Expand]Application UI Manager
  [Expand]Docking Library
  [Expand]Data Grid
  [Expand]Vertical Grid
  [Expand]Property Grid
  [Expand]Pivot Grid
  [Expand]Tree List
  [Expand]Gantt Control
  [Expand]Chart Control
  [Expand]Diagrams
  [Expand]Gauges
  [Expand]Map Control
  [Expand]Scheduler
  [Expand]Spreadsheet
  [Collapse]Rich Text Editor
   [Expand]Product Information
    Product Class Structure
    Supported Formats
   [Expand]Getting Started
   [Expand]RichEditControl Document
   [Expand]Fields
    Text Formatting
    Import and Export
   [Collapse]Page Layout
     Table of Contents
     Line Numbering
     Layout API
    Printing
    Hyphenation
    Spell Checking
    AutoCorrect Feature
    Track Changes
    Mail Merge
    Restrictions and Protection
   [Expand]Visual Elements
    Services
    Events
    Commands
    Keyboard Shortcuts
    HTML Tag Support
   [Expand]Examples
  [Expand]Spell Checker
  [Expand]Form Layout Managers
  [Expand]Navigation Controls
  [Expand]Printing-Exporting
  [Expand]PDF Viewer
   Reporting
  [Expand]Snap
  [Expand]TreeMap Control
  [Expand]Sunburst Control
 [Expand]Common Features
  Get More Help
 [Expand]API Reference
[Expand]ASP.NET Controls and MVC Extensions
[Expand]ASP.NET Bootstrap Controls
[Expand]ASP.NET Core Bootstrap Controls
[Expand]WPF Controls
[Expand]Xamarin Controls
[Expand]Windows 10 App Controls
[Expand]Office File API
[Expand]Reporting
[Expand]Report and Dashboard Server
[Expand]Dashboard
[Expand]eXpressApp Framework
[Expand]eXpress Persistent Objects
[Expand]CodeRush
[Expand]CodeRush Classic
[Expand]Cross-Platform Core Libraries
[Expand]Tools and Utilities
 End-User Documentation
View this topic on docs.devexpress.com (Learn more)

Layout API

This document introduces Layout API for the Rich Text Editor - objects, properties and methods that allow you traverse the document layout tree and access layout elements.

Expanded Layout API Overview

The Layout API is located in the DevExpress.RichEdit.v19.2.Core.dll assembly, and is available for both WinForms and WPF Rich Text Editor, as well as for Word Processing File API. It can be used to arbitrarily display layout elements and draw graphics within the element boundaries (expected in future versions) .

Expanded Layout API Object Model

The document layout model in the Layout API is a hierarchical tree-like structure. Each node in a tree is an instance of a certain class which implements a base interface named LayoutElement. A class representing a particular element is named after that element with addition of the prefix Layout or a suffix Box. There are LayoutPage, LayoutHeader, LayoutPageArea, LayoutFooter, ... BookmarkBox, PlainTextBox etc. A layout element may or may not have a related RangedLayoutElement.Range in the document.

The structure of a sample document is shown in the picture below. The document consists of three pages, has a header and a footer, the first page has a floating text box and a floating picture. The text is organized in one column, the first page has only three lines of text. The first line of text includes a floating object's anchor and five plain text boxes (a plain text box can be a space, a text with uniform formatting or a paragraph mark).

Tip

Call the HitTestManager.HitTest method to obtain the RichEditHitTestResult instance containing information about the element located under the test point. Refer to the How to: Determine the Document Element under the Mouse Pointer topic for details.

Expanded Starting Point

The main entry point of the Layout API in WinForms Rich Editor is the RichEditControl.DocumentLayout property. This property provides access to the DocumentLayout object containing basic properties and methods for working with the hierarchy of the document layout objects. After any changes in text or formatting, the document layout is recalculated and the DocumentLayout.DocumentFormatted event fires.

Note

The DocumentFormatted event handler is running in a background thread. To avoid concurrency issues, execute the code which affects the document or interacts with the user asynchronously in a UI thread using the RichEditControl.BeginInvoke method.

Expanded Traversing Layout Tree

The LayoutIterator and LayoutVisitor allow you to collect information about document element's location (bounds, nearest element, etc.) and range.

The table below compares LayoutVisitor and LayoutIterator features. This comparison allows you to decide what to use depending on your current task.

Travel Direction Can Iterate Only a Specific Layout Level Visits Complex Layout Elements
LayoutVisitor Down No True
LayoutIterator Up and Down (using LayoutIterator.MoveNext and LayoutIterator.MovePrevious methods). Yes. Pass the one of the LayoutLevel values to the Move.. method to complete the task. False. Create a new LayoutIterator when visiting complex elements (header/footer, floating objects, comments)

Code samples below show how to use LayoutIterator and LayoutVisitor to count lines in the document's main body. The message box displays the result amount, as shown on the image.

Use LayoutIterator

Use LayoutVisitor

Expanded Custom Draw

The RichEditControl.BeforePagePaint event allows you to specify a descendant of the PagePainter class to implement custom draw for layout elements.

The following image illustrates custom draw applied to the PlainTextBox and LayoutFloatingPicture elements.

Original document Custom Draw using PagePainter descendant

Expanded See Also

Is this topic helpful?​​​​​​​