Dual-layer responsiveness: display-level adaptability combined with server-side platform detection.
Platform → UI Technology→ Clients | WebAssembly | Symbols | Drawing | Responsive | Layouts
Two-Layer Responsive Architecture
FrameworX implements responsiveness at two distinct levels: display-level resize behavior (how content adapts within a display) and server-side responsive selection (RESS - which displays are delivered to each platform).
This dual approach enables true "build once, run everywhere" capability while optimizing for each device class.
Overview
Display Responsiveness
Both dashboards and canvas displays have customizable responsiveness. They can stretch proportionately to the client area, maintaining the spatial relationship of objects, or reposition objects internally.
The configuration of this behavior is defined at the Display-Level using the OnResize property of the displays.
Responsive Design & RESS
Responsive Design + Server-Side Components (RESS) delivers optimal user experience across all devices.
The configuration of this behavior is implemented at the Layout-Level; the internal displays remain the same:
- Build-once: Share display configurations across multiple device types
- Run everywhere: Identifies the client device and delivers content with the proper layout
Server Side Layouts
Display-Level Responsiveness (OnResize)
Every display—whether created with Canvas or Dashboard drawing tools—has configurable resize behavior through the
OnResize property:
| OnResize Mode | Behavior | Use Case | Typical For |
|---|---|---|---|
| StretchUniform | Scales maintaining aspect ratio | Complex diagrams, P&IDs | Canvas (default) |
| StretchFill | Fills space, may distort | Backgrounds, simple graphics | Rare |
| Responsive | Elements reposition/resize individually | Data displays, forms, headers, menus | Dashboard (default) |
| ResizeChildren | All elements scale proportionally | Viewer and text pages, maintain exact layout | Canvas alternative |
| NoAction | Fixed size, may clip | Popups, dialogs, forms, fixed-size panels | Special case |
Important: Canvas vs Dashboard is about the drawing method, not responsiveness. A Canvas display can be responsive, and a Dashboard display can use StretchUniform. The drawing tool determines how you position objects during design; OnResize determines runtime behavior.
Recommended OnResize by Display Type
The five modes map cleanly to display purpose. This is the authoritative reference for OnResize selection across the documentation — use it as a decision tree, picking the row that matches the display you are building:
| Display Type | Recommended OnResize | Why |
|---|---|---|
| Canvas whose prominent element should grow — DataGrid, TrendChart, AlarmViewer, asset tree | Responsive | The display fills the client area and the dominant control stretches with it. Set per-element locks (below) on the control that should grow; small labels and nav icons keep no locks and stay put |
| Process diagram, P&ID, equipment layout or mimic | StretchUniform | Preserves aspect ratio; prevents vessel and pipe distortion under non-square viewports |
| Viewer and text pages — text-led content where everything scales together | ResizeChildren | All elements scale proportionally as one unit, keeping text and its surrounding layout in proportion |
| Header / Footer / Menu (docked regions) | Responsive + LockedHeight (Header / Footer) or Responsive + LockedWidth (Menu) | The region stays responsive so its content reflows, while the docked band height (Header/Footer) or rail width (Menu) is pinned to native pixels. Match the Header native Width to the Layout Width so it does not compress horizontally |
| Popup, Dialog, Form | NoAction | The carefully tuned pixel layout stays exactly as designed; these surfaces are sized to their content, not to a resizable client area |
| Background art, decorative full-bleed image | StretchFill | Fills the viewport edge to edge; distortion is acceptable because no measurements are conveyed |
StretchFill is not a sensible default. It is the right choice only for backgrounds and decorative full-bleed art — never for a process diagram, KPI surface, or any display whose elements convey measurements or relative positions.
Docked Header / Footer / Menu use Responsive, not NoAction. A docked region is set to Responsive together with LockedHeight (Header/Footer band) or LockedWidth (Menu/SubMenu rail) so the band stays a fixed thickness while its content still reflows to the available width. Setting a docked Header to NoAction is the wrong knob — it freezes the whole region instead of pinning only the thickness.
Per-Element Locks (Responsive displays)
When a display uses OnResize=Responsive, individual elements decide how they react as the display grows. Four element-level locks control this, set per element in the Properties panel:
| Element lock | Effect when the display grows |
|---|---|
| IsWidthAlign | Stretches the element's width with the container |
| IsHeightAlign | Stretches the element's height with the container |
| IsLeftAlign | Moves the element to track the right edge (keeps a fixed right margin) |
| IsTopAlign | Moves the element to track the bottom edge (keeps a fixed bottom margin) |
Combine them per the element's role:
- Prominent grid / chart / viewer that should fill the display — IsWidthAlign + IsHeightAlign
- Full-width band or row (toolbar, panel that spans the width) — IsWidthAlign only
- Bottom-pinned input row (entry boxes anchored to the bottom) — IsTopAlign + IsWidthAlign
- Right-edge control (button or icon that should hug the right side) — IsLeftAlign
- Small top-left labels and nav icons — no locks; they keep their position and size
These element locks are honored only when the display's OnResize is Responsive. Under StretchUniform, StretchFill, ResizeChildren or NoAction they have no effect — those modes treat the whole display as one unit.
Pinning Docked Regions (LockedWidth / LockedHeight)
Two display-level locks pin a docked region to native pixels while it stays Responsive:
- LockedHeight — pins a docked Header or Footer band to its native height. The band keeps its pixel thickness instead of stretching vertically.
- LockedWidth — pins a docked Menu or SubMenu rail to its native width. The rail keeps its pixel width instead of stretching horizontally.
Use these on the display that is assigned to the corresponding Layout region. They are the correct way to keep a header bar a fixed thickness or a side menu a fixed width while the central content area absorbs all the extra space.
Authoring discipline: set all six locks — the four element locks (IsWidthAlign / IsHeightAlign / IsLeftAlign / IsTopAlign) and the two display locks (LockedWidth / LockedHeight) — through the Designer Properties panel, not by hand-editing display XAML.
Responsive Canvas
When a Canvas display uses OnResize="Responsive", individual elements (via the per-element locks above) can be configured to:
- Maintain fixed margins from edges
- Scale width/height proportionally
- Anchor to specific sides
- Combine fixed and proportional sizing
Example: A sidebar that maintains fixed width while content area expands.
Dashboard Responsiveness
Dashboard displays inherently support grid-based responsiveness:
- Grid cells redistribute based on available space
- Content within cells follows cell boundaries
- Automatic conversion to vertical stack on mobile portrait
Defaults:
- Canvas displays default to StretchUniform - preserving diagram integrity
- Dashboard displays default to Responsive - adapting to screen size
Composition Patterns
Home as a Dashboard with two ChildDisplays
The recommended landing-page pattern is a Dashboard "Home" display that hosts two ChildDisplays rather than a single monolithic screen. The Home Dashboard uses a TGrid with Star columns and a TGridSplitter; each cell embeds one ChildDisplay. The Dashboard itself carries no element locks — the Star grid distributes space, and each embedded display manages its own internal responsiveness.
This keeps each half independently authorable and reusable, and lets the splitter give the operator control over the balance between the two panes.
Splitting a Canvas for mobile
When a Canvas page must also render on a phone, do not try to reflow one wide Canvas into a narrow viewport. Instead split it into two child displays, each its own Canvas, and deliver the pair via RESS layout selection. Each child Canvas is then sized and tuned for the device class it serves, while the desktop layout shows both together.
Worked Examples — Asset Monitor Demo
The shipped Asset Monitor demo solution applies these rules end to end. The table below shows how each display is configured — a concrete reference for the decision tree above.
| Display (role) | OnResize | Locks | Notes |
|---|---|---|---|
| Header | Responsive | LockedHeight | Native width matched to the Layout width so the header does not compress horizontally |
| HeaderPad | Responsive | LockedHeight | Thin docked band above content |
| HeaderMobile | NoAction | LockedWidth + LockedHeight | Compact fixed header used on the mobile layout |
| MenuTree (side menu) | Responsive | LockedWidth | The asset tree element carries IsWidthAlign + IsHeightAlign so it fills the rail; the three bottom text boxes carry IsTopAlign + IsWidthAlign to stay anchored to the bottom and span the width |
| Area (content Canvas) | Responsive | per-element | The data grid carries IsWidthAlign + IsHeightAlign; the flow panel carries IsWidthAlign; the top-left label text boxes carry no locks |
| Home / OEEDashboard | Responsive (Dashboard) | none | TGrid Star columns + TGridSplitter + two ChildDisplays; the grid does the work, so no element locks are needed |
| OEE_Left / OEE_Right | StretchUniform | — | Fixed-aspect card panels living inside dashboard cells; uniform scaling keeps the cards undistorted |
| Site views (Dallas, Detroit, Houston, Europe) | ResizeChildren | — | Text-led viewer pages where everything scales together |
Server-Side Responsive (RESS)
RESS (Responsive + Server-Side) adds intelligence before content delivery. The server identifies the client type and sends optimized content.
Responsive Design + Server-Side Components (RESS) delivers optimal user experience across all devices:
- Build-once: Share display configurations across multiple device types
- Run everywhere: Identifies the client device and delivers content with the proper layout
- Server Detection: Identifies device class (phone, tablet, desktop)
- Optimized Delivery: Sends appropriate content and resources
- Responsive Behavior: Maintains flexibility within device class
- Reduced Engineering Time: All displays are shared by all layouts
- Result: Fast loading with adaptive layouts
Client Detection
| Client Type | Detection Method | Typical Delivery |
|---|---|---|
| Desktop Native | WPF client signature | Full interface, all regions |
| Desktop Web | Browser user agent | Full interface, web-optimized |
| Tablet | Screen size + touch | Simplified menu, touch controls |
| Mobile Portrait | Aspect ratio + size | Single column, essential only |
| Mobile Landscape | Aspect ratio + size | Adapted layout, larger controls |
RESS Benefits
- Reduced bandwidth - Only necessary resources sent
- Faster loading - Optimized content for device
- Better UX - Platform-appropriate interfaces
- Single source - One configuration, multiple outputs
How Layers Work Together
The two responsive layers complement each other:
- Server decides WHAT - Which layout and displays to send
- Display decides HOW - How content adapts to screen changes
Example Workflow
| Stage | Desktop | Mobile |
|---|---|---|
| 1. Client connects | Identifies as WPF client | Identifies as mobile browser |
| 2. Server selects | Full layout with all regions | Mobile layout, header+content only |
| 3. Display loads | P&ID with StretchUniform | Simplified dashboard, Responsive |
| 4. User resizes | Maintains aspect ratio | Reflows to new orientation |
Configuration Points
Display Level (OnResize)
Set in Display properties during design:
- Choose resize mode per display
- Configure responsive anchoring for Canvas (per-element locks)
- Pin docked Header/Footer/Menu regions with LockedHeight / LockedWidth
- Test with preview at different sizes
Server Level (RESS)
Configure in Layouts:
- Assign platform-specific displays
- Define fallback options
- Set region visibility per platform
Precision note: a Layout region's "Header set to Stretch (spans full width)" refers to the region's HorizontalAlign = Stretch — how the region fills its Layout column. That is a different knob from the display's OnResize mode. Do not conflate region HorizontalAlign with OnResize=StretchUniform; they govern different things.
Details in Layouts and Navigation.
Design Strategies
Progressive Enhancement
- Design for smallest screen first (mobile)
- Add complexity for larger screens
- Use RESS to deliver appropriate version
- Let OnResize handle minor adjustments
Graceful Degradation
- Create full-featured desktop version
- Define simplified mobile alternatives
- RESS automatically selects based on client
- OnResize maintains usability during transitions
Best Practices
| Scenario | Recommended Approach |
|---|---|
| Complex P&ID diagram | Canvas with StretchUniform, desktop-only via RESS |
| KPI dashboard | Dashboard with Responsive, shared across platforms |
| Data entry form | Dashboard with Responsive, simplified mobile version |
| Equipment mimic | Canvas with StretchUniform (or ResizeChildren), tablet/desktop only |
| Header / Footer band | Responsive + LockedHeight, header native width matched to layout width |
| Side menu | Responsive + LockedWidth |
| Popup / dialog / form | NoAction |
| Landing page | Dashboard "Home" with two ChildDisplays (Star grid + splitter) |
| Status overview | Dashboard with Responsive, all platforms |
In this section...

