StatusBarControl
March 15, 2026 · View on GitHub
Single-row status bar with three alignment zones, clickable items, and shortcut key hints.
Overview
StatusBarControl renders a horizontal bar with left, center, and right zones for displaying status information, keyboard shortcuts, and clickable items. Items consist of an optional shortcut hint (rendered with an accent color) and a label. The control does not receive keyboard focus — it is display and click only.
By default the status bar sticks to the bottom of the window (StickyPosition.Bottom). An optional horizontal separator line can be rendered above the content.
See also: ToolbarControl — for interactive button toolbars
Quick Start
var statusBar = Controls.StatusBar()
.AddLeft("↑↓", "Navigate")
.AddLeft("Enter", "Select")
.AddLeftSeparator()
.AddLeft("Esc", "Exit")
.AddCenterText("[dim]My Application[/]")
.AddRight("Ctrl+S", "Save")
.WithAboveLine()
.WithBackgroundColor(Color.Grey15)
.WithShortcutForegroundColor(Color.Cyan1)
.StickyBottom()
.Build();
window.AddControl(statusBar);
Builder API
Create a StatusBarBuilder through the Controls factory:
var builder = Controls.StatusBar();
Adding Items
Items can be added to three zones. Each method returns the builder for chaining.
// Left zone
.AddLeft(string shortcut, string label, Action? onClick = null)
.AddLeftText(string text, Action? onClick = null)
.AddLeft(StatusBarItem item)
.AddLeftSeparator()
// Center zone
.AddCenter(string shortcut, string label, Action? onClick = null)
.AddCenterText(string text, Action? onClick = null)
.AddCenter(StatusBarItem item)
.AddCenterSeparator()
// Right zone
.AddRight(string shortcut, string label, Action? onClick = null)
.AddRightText(string text, Action? onClick = null)
.AddRight(StatusBarItem item)
.AddRightSeparator()
Style Methods
.WithBackgroundColor(Color color) // Status bar background
.WithForegroundColor(Color color) // Label text color
.WithShortcutForegroundColor(Color color) // Shortcut hint accent color
.WithAboveLine(bool show = true) // Horizontal separator line above content
.WithAboveLineColor(Color color) // Separator line color (also enables line)
.WithItemSpacing(int spacing) // Space between items (default: 2)
.WithSeparatorChar(string separator) // Section separator character (default: "|")
.WithShortcutLabelSeparator(string sep) // Shortcut-label separator (default: ":")
Layout Methods
.WithMargin(int left, int top, int right, int bottom)
.WithMargin(int margin)
.WithMargin(Margin margin)
.WithAlignment(HorizontalAlignment align)
.WithStickyPosition(StickyPosition pos)
.StickyTop()
.StickyBottom()
Identity Methods
.WithName(string name)
.WithTag(object tag)
Event Methods
.OnItemClicked(EventHandler<StatusBarItemClickedEventArgs> handler)
Building
StatusBarControl control = builder.Build();
// Implicit conversion is also supported:
StatusBarControl control = Controls.StatusBar()
.AddLeft("Esc", "Close");
Properties
| Property | Type | Default | Description |
|---|---|---|---|
BackgroundColor | Color | theme/container | Status bar background color |
ForegroundColor | Color | theme/container | Label text color |
ShortcutForegroundColor | Color | theme/Cyan1 | Accent color for shortcut hints |
ItemSpacing | int | 2 | Space between adjacent items |
SeparatorChar | string | "|" | Character rendered for separator items |
ShortcutLabelSeparator | string | ":" | Text between shortcut and label (e.g. "Ctrl+S:Save") |
ShowAboveLine | bool | false | Render horizontal line above content |
AboveLineColor | Color? | null | Line color (null uses foreground) |
LeftItems | IReadOnlyList<StatusBarItem> | — | Items in the left zone |
CenterItems | IReadOnlyList<StatusBarItem> | — | Items in the center zone |
RightItems | IReadOnlyList<StatusBarItem> | — | Items in the right zone |
StatusBarItem Properties
Each item in the status bar is a StatusBarItem with these properties:
| Property | Type | Default | Description |
|---|---|---|---|
Shortcut | string? | null | Key hint text rendered with accent color |
Label | string | "" | Label text (supports markup) |
IsVisible | bool | true | Whether the item is rendered |
IsSeparator | bool | false | Render as separator character |
OnClick | Action? | null | Click handler for this item |
ShortcutForeground | Color? | null | Override shortcut color for this item |
ShortcutBackground | Color? | null | Override shortcut background for this item |
LabelForeground | Color? | null | Override label color for this item |
LabelBackground | Color? | null | Override label background for this item |
Events
| Event | Arguments | Description |
|---|---|---|
ItemClicked | StatusBarItemClickedEventArgs | Fired when any non-separator item is clicked |
MouseClick | MouseEventArgs | Fired on any mouse click on the status bar |
Mouse Interaction
- Click on an item fires the item's
OnClickhandler and theItemClickedevent - Click on a separator has no effect
- The status bar does not receive keyboard focus
Dynamic Updates
Items can be modified at runtime. Changes trigger automatic re-rendering.
// Update an item's text
var counterItem = statusBar.RightItems[0];
counterItem.Label = "[yellow]5 outdated[/]";
// Add items at runtime
statusBar.AddLeft("F5", "Refresh");
// Remove items
var items = statusBar.LeftItems;
if (items.Count > 0)
statusBar.RemoveLeft(items[items.Count - 1]);
// Batch updates for performance
statusBar.BatchUpdate(() =>
{
statusBar.AddLeft("A", "Action1");
statusBar.AddLeft("B", "Action2");
statusBar.AddLeft("C", "Action3");
});
Examples
Application Status Bar
var statusBar = Controls.StatusBar()
.AddLeft("↑↓", "Navigate")
.AddLeft("Enter", "View")
.AddLeftSeparator()
.AddLeft("Esc", "Exit")
.AddCenterText("[dim]StatusBar Demo[/]")
.AddRightText("[yellow]3 outdated[/]")
.AddRight("Ctrl+S", "Search")
.WithAboveLine()
.WithBackgroundColor(Color.Grey15)
.WithShortcutForegroundColor(Color.Cyan1)
.StickyBottom()
.Build();
Status Bar with Click Handlers
var statusBar = Controls.StatusBar()
.AddLeft("F5", "Refresh", () => RefreshData())
.AddLeft("F2", "Edit", () => StartEditing())
.AddRight("Ctrl+Q", "Quit", () => windowSystem.Stop())
.OnItemClicked((sender, args) =>
{
var display = args.Item.Shortcut != null
? $"{args.Item.Shortcut}:{args.Item.Label}"
: args.Item.Label;
// Log which item was clicked
})
.StickyBottom()
.Build();
Status Bar at Top
var topBar = Controls.StatusBar()
.AddLeftText("[bold cyan]My App[/]")
.AddRightText($"[dim]v{version}[/]")
.StickyTop()
.WithBackgroundColor(Color.Grey11)
.Build();
Per-Item Color Overrides
var errorItem = new StatusBarItem
{
Label = "3 errors",
LabelForeground = Color.Red,
OnClick = () => ShowErrors()
};
var statusBar = Controls.StatusBar()
.AddRight(errorItem)
.StickyBottom()
.Build();
Toggling Item Visibility
bool centerVisible = true;
toggleBtn.Click += (_, _) =>
{
centerVisible = !centerVisible;
var centerItems = statusBar.CenterItems;
if (centerItems.Count > 0)
centerItems[0].IsVisible = centerVisible;
};
Best Practices
- Use shortcut+label pairs for keyboard-driven items — the accent color makes shortcuts discoverable
- Use
AddLeftText/AddCenterText/AddRightTextfor display-only items without keyboard hints - Batch updates when adding multiple items at once to avoid redundant re-renders
- Use markup in labels for dynamic coloring (e.g.
[yellow]3 warnings[/]) - Stick to bottom (default) for traditional status bars; use
StickyTop()for header bars - Enable
WithAboveLine()to visually separate the status bar from content above
See Also
- ToolbarControl - Interactive button toolbar with wrapping
- Status System - System-level status bars and taskbar