Dependency Properties
Control state is DP-backed for metadata, callbacks, styling, and binding support.
TerminalNinja
Build rich terminal interfaces with a familiar dependency property system, XAML markup, data binding, theming, and modern rendering — designed for performance and deployment simplicity.
Create your first TerminalNinja app in a few minutes.
net10.0.TerminalNinja.TerminalXaml.Load.using TerminalNinja.App;
using TerminalNinja.Controls;
using TerminalNinja.Xaml;
using var app = new Application(new ApplicationOptions
{
TargetFps = 60,
EnableMouseTracking = true,
EnableTabNavigation = true
});
app.ThemeName = "GruvboxDark";
var window = TerminalXaml.Load<Window>(XamlLayouts.MainLayout, viewModel);
window.Show();
app.Run();
<Window xmlns='http://schemas.terminalninja.dev/xaml'
Title='My App' Width='80' Height='24'>
<StackPanel Orientation='Vertical'>
<TextBlock Text='Welcome to TerminalNinja' />
<Button Text='Click Me' Command='{Binding ClickCommand}' />
</StackPanel>
</Window>
TerminalNinja keeps WPF mental models so desktop developers can move fast.
Control state is DP-backed for metadata, callbacks, styling, and binding support.
Describe UI declaratively with the TerminalNinja XML namespace and familiar property syntax.
Use {Binding}, RelativeSource, converters, and MVVM patterns.
Share values with StaticResource and apply consistent look with Style/Setter.
Explore working examples that demonstrate every major feature.
Interactive button with ICommand binding, hover/focus colors, and keyboard support.
View docs →Toggle control with [x] / [ ] indicator and content label.
View docs →Mutually exclusive option with (*) / ( ) indicator and GroupName.
View docs →Dropdown selection control with popup item list.
View docs →Editable text input with caret, selection, and placeholder support.
View docs →Selectable list with keyboard navigation and ObservableCollection binding.
View docs →Multi-column data display with headers, grid lines, and row selection.
View docs →Hierarchical data display with expand/collapse navigation.
View docs →Tabbed content switching with header strip and keyboard navigation.
View docs →Scrollable viewport with keyboard and mouse wheel navigation.
View docs →Determinate, indeterminate, and styled progress indicators.
View docs →Read-only multi-column grid with sorting indicators and row selection.
View docs →Color selection with palette grid, hex entry, and preview swatch.
View docs →Modal dialog for browsing and selecting files.
View docs →Modal dialog for browsing and selecting a folder.
View docs →Pixel rendering using half-block characters for 2x vertical resolution.
View docs →Numeric input with arrow key increment/decrement and direct digit entry.
View docs →Date input with field-by-field editing and calendar icon.
View docs →Time input with hours/minutes/seconds fields and clock icon.
View docs →Combined date and time input with calendar icon.
View docs →Rows, columns, star/fixed sizing, and row/column spans.
View docs →Vertical/horizontal stacking with Auto, Fixed, and Stretch sizing.
View docs →One-way and two-way binding, value converters, and animated colors.
View docs →Modal dialogs with OK/Cancel, dimmed background, and async results.
View docs →
TerminalNinja ships with three built-in themes that apply implicit styles and color resources
across all controls. Set the theme on the Application instance:
app.ThemeName = "Dark"; // VS Code-inspired dark
app.ThemeName = "Dracula"; // Dracula color scheme
app.ThemeName = "GruvboxDark"; // Gruvbox dark palette
Themes define 58 color resource keys and implicit styles for all built-in controls. Load custom themes from file or XAML string:
app.LoadThemeFromFile("MyTheme.xaml");
app.LoadThemeFromXaml(customXaml);
Try switching themes in the playground.
TerminalNinja automatically enables XAML hot reload when a debugger is attached.
Edit any .xaml file and save — the UI updates instantly without restarting.
ViewModels and application state are preserved.
// Automatic — just run with debugger attached
// Or enable manually:
app.EnableHotReload("path/to/project");
Hot reload works by watching .xaml files with FileSystemWatcher,
re-parsing on change via TerminalXaml.LoadFromStream, and swapping the control tree.
Source-generated registries (control factories, property accessors) are unaffected —
only the view is reloaded. XAML parse errors are caught gracefully, not crashes.