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.

KeyMoves to
Arrow keysThe neighbouring cell. In a card view, left and right go to the next card, up and down a whole row of cards.
Ctrl+arrowThe edge of the data in that direction.
Home / EndThe first / last cell of the row.
Ctrl+Home / Ctrl+EndThe first / last cell of the grid.
Page Up / Page DownOne screen up / down.
Enter / Shift+EnterThe cell below / above.
Tab / Shift+TabThe next / previous cell. Without a current cell, Tab belongs to the window's focus order.
F6 / Shift+F6The next / previous level: cells, filter row, group band — and on to the window's next region when the host offers one.

Actions

KeyDoes
F2Opens the editor. Typing does too, and replaces the content.
F4, Alt+DownOpens the cell's picker (options or calendar).
SpaceFolds a group or tree row; toggles a checkbox cell.
Shift+Space / Ctrl+SpaceSelects the row / the column.
Ctrl+ASelects everything.
Ctrl+C, Ctrl+Shift+C, Ctrl+V, Ctrl+XCopy, copy with captions, paste, cut. Ctrl+Insert and Shift+Insert work too.
Delete, Ctrl+DClear the selection; fill down.
Ctrl+Z, Ctrl+YUndo, redo (Ctrl+Shift+Z also redoes).
Ctrl+F, Ctrl+KThe search bar; the quick-search palette.
EscCloses the innermost thing: a pane, an editor, a drag, then the selection.
Ctrl+wheelZooms 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.

Zoom
grid.AllowZoom = false;     // Ctrl+wheel scrolls instead of zooming
grid.Zoom = 1.25;           // 125 %, clamped to 0.5 ... 3

Screen 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:

Spoken and searchable text
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 use

The micro-chart columns (sparkline, bullet, variance and the others) carry their values as text for the reader, for search and for copy.

The spoken texts are German by default

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

System settings and your own messages
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.