Keyboard and accessibility
The grid is one control to the platform but many elements to a user. Keyboard navigation, the screen-reader layer and the system's contrast and motion settings are part of the shared engine, so they behave the same on every host.
Navigation
| Key | Moves to |
|---|---|
| Arrow keys | The neighbouring cell. In a card view, left and right go to the next card, up and down a whole row of cards. |
| Ctrl+arrow | The edge of the data in that direction. |
| Home / End | The first / last cell of the row. |
| Ctrl+Home / Ctrl+End | The first / last cell of the grid. |
| Page Up / Page Down | One screen up / down. |
| Enter / Shift+Enter | The cell below / above. |
| Tab / Shift+Tab | The next / previous cell. Without a current cell, Tab belongs to the window's focus order. |
| F6 / Shift+F6 | The next / previous level: cells, filter row, group band — and on to the window's next region when the host offers one. |
Actions
| Key | Does |
|---|---|
| F2 | Opens the editor. Typing does too, and replaces the content. |
| F4, Alt+Down | Opens the cell's picker (options or calendar). |
| Space | Folds a group or tree row; toggles a checkbox cell. |
| Shift+Space / Ctrl+Space | Selects the row / the column. |
| Ctrl+A | Selects everything. |
| Ctrl+C, Ctrl+Shift+C, Ctrl+V, Ctrl+X | Copy, copy with captions, paste, cut. Ctrl+Insert and Shift+Insert work too. |
| Delete, Ctrl+D | Clear the selection; fill down. |
| Ctrl+Z, Ctrl+Y | Undo, redo (Ctrl+Shift+Z also redoes). |
| Ctrl+F, Ctrl+K | The search bar; the quick-search palette. |
| Esc | Closes the innermost thing: a pane, an editor, a drag, then the selection. |
| Ctrl+wheel | Zooms the grid between 50 % and 300 %. |
Inside a drawn pane — a filter list, a menu, the calendar — Tab moves between its parts, Space and Enter activate, the arrow keys move inside a list, and Escape closes it. Ctrl together with Alt is left alone, because it is AltGr on many keyboard layouts.
grid.AllowZoom = false; // Ctrl+wheel scrolls instead of zooming
grid.Zoom = 1.25; // 125 %, clamped to 0.5 ... 3Screen readers
The grid exposes UI Automation on all three hosts from one source, so the sentences, rectangles and actions are the same and only the platform peers differ. On WPF the grid is a data grid whose cells carry the grid, table, scroll, value, toggle and invoke patterns; on Avalonia there are cell and header peers; on WinForms an MSAA tree. Rows, headers, the drawn panes and menus are elements too.
It has been tested with Narrator and NVDA, by an automated listening test and by hand. The known gaps are listed on What it does not do yet — above all, Avalonia 12.1 has no grid or table provider, so a reader's table navigation does not follow rows and columns there.
What a reader says comes from the cell's text. Where that is not enough, say it:
Column.CheckboxDisplay<Order>("Active", o => o.Checked)
.SpeakAs(o => o.Checked ? "active" : "inactive"); // what a screen reader says
Column.Composed<Order>("Status",
Cell.Badge<Order>(o => Label(o.Status), o => Palette.Blue))
.Searchable(o => Label(o.Status)); // what search, filter and copy useThe micro-chart columns (sparkline, bullet, variance and the others) carry their values as text for the reader, for search and for copy.
The screen-reader sentences ship in German, like the rest of the built-in texts, so that announcements do not change with the machine they run on. Call ArionUiText.UseEnglishTexts() at start-up for everything, or UseEnglishAccessibilityTexts() for the spoken sentences only. See Localisation.
Contrast, motion, announcements
ArionUiText.UseEnglishAccessibilityTexts(); // only the spoken sentences, if the UI stays German
grid.AutoHighContrast = false; // manage high contrast yourself
grid.VisualTheme = ArionTheme.HighContrastDark();
ArionMotion.Reduce = true; // no transitions, whatever the system says
grid.Api.Accessibility.Announce("Import finished: 1,204 orders");An immediate-mode surface is invisible to the Windows high-contrast setting, so the hosts follow it themselves: they switch to HighContrastDark() or HighContrastLight() while the mode is on and restore your theme afterwards. AutoHighContrast = false hands that decision to you.
The hosts follow the system's reduce-motion setting until the application sets ArionMotion.Reduce; from then on the application's choice wins. ArionMotion.FollowSystemAgain() hands it back.
