{"id":14966929,"url":"https://github.com/reactivemarbles/crisscross","last_synced_at":"2026-05-19T10:01:12.623Z","repository":{"id":65185382,"uuid":"381117604","full_name":"reactivemarbles/CrissCross","owner":"reactivemarbles","description":"A Navigation Framework for ReactiveUI based projects","archived":false,"fork":false,"pushed_at":"2025-04-01T16:21:44.000Z","size":15601,"stargazers_count":42,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-09T23:37:27.673Z","etag":null,"topics":["avalonia","maui","reactiveui","webview2","wpf","xamarin"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reactivemarbles.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"reactivemarbles"}},"created_at":"2021-06-28T17:51:20.000Z","updated_at":"2025-04-01T15:48:57.000Z","dependencies_parsed_at":"2023-02-19T15:45:44.629Z","dependency_job_id":"83809885-ea44-4ddb-82bc-dd468f4da38a","html_url":"https://github.com/reactivemarbles/CrissCross","commit_stats":{"total_commits":204,"total_committers":3,"mean_commits":68.0,"dds":"0.24019607843137258","last_synced_commit":"dcc15d2e138ac895fd375b9c908d06d679d399f3"},"previous_names":["reactivemarbles/crisscross","chrispulman/crisscross"],"tags_count":54,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactivemarbles%2FCrissCross","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactivemarbles%2FCrissCross/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactivemarbles%2FCrissCross/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactivemarbles%2FCrissCross/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reactivemarbles","download_url":"https://codeload.github.com/reactivemarbles/CrissCross/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252116289,"owners_count":21697348,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avalonia","maui","reactiveui","webview2","wpf","xamarin"],"created_at":"2024-09-24T13:37:10.114Z","updated_at":"2026-05-19T10:01:12.608Z","avatar_url":"https://github.com/reactivemarbles.png","language":"C#","funding_links":["https://github.com/sponsors/reactivemarbles"],"categories":[],"sub_categories":[],"readme":"\n\u003cbr\u003e\n\u003ca href=\"https://github.com/reactivemarbles/CrissCross\"\u003e\n  \u003cimg width=\"160\" heigth=\"160\" src=\"https://raw.githubusercontent.com/reactivemarbles/CrissCross/master/Images/CrissCrossIcon_256.png\"\u003e\n\u003c/a\u003e\n\u003cbr\u003e\n\n# CrissCross\n\nCrissCross is a ReactiveUI-first application toolkit for .NET desktop and cross-platform apps. It provides a shared navigation model, lifecycle helpers, reusable state objects, themed UI controls, shell services, plot integration, and WebView2 hosting across WPF, Avalonia, MAUI, and WinForms.\n\nThis is the canonical documentation source for every library project and package in this solution:\n\n| Library | Purpose |\n| --- | --- |\n| `CrissCross` | Core ReactiveUI lifecycle, view-model navigation contracts, bidirectional navigation registry, and shared UI state models. |\n| `CrissCross.Avalonia` | Avalonia navigation windows, routed view hosts, reactive transition content, and base Avalonia integration. |\n| `CrissCross.Avalonia.UI` | Avalonia themed controls, Fluent-style app shell controls, services, resources, themes, and gallery-ready user controls. |\n| `CrissCross.MAUI` | MAUI Shell navigation host and ReactiveUI integration. |\n| `CrissCross.Maui.UI` | MAUI themed controls and shared feature controls backed by the same core state models. |\n| `CrissCross.WinForms` | WinForms navigation forms and routed view hosts. |\n| `CrissCross.WPF` | WPF navigation windows, routed view hosts, WebView navigation host, single-instance helper, and WPF integration. |\n| `CrissCross.WPF.Plot` | WPF/ScottPlot live charting, reactive plot binding, plot adapters, and plot view models. |\n| `CrissCross.WPF.UI` | WPF themed controls, Fluent-style shell services, themes, resource dictionaries, and gallery controls. |\n| `CrissCross.WPF.WebView2` | WPF WebView2 wrapper with overlay window hosting support. |\n\n\n## Target Frameworks\n\n| Library | Target frameworks |\n| --- | --- |\n| `CrissCross` | `net8.0`, `net9.0`, `net10.0`, plus Windows TFMs from repository build props where enabled. |\n| `CrissCross.Avalonia` | `net8.0`, `net9.0`, `net10.0`. |\n| `CrissCross.Avalonia.UI` | `net8.0`, `net9.0`, `net10.0`. |\n| `CrissCross.MAUI` | `net9.0`, `net10.0`, plus MAUI platform TFMs for Android, iOS, Mac Catalyst, macOS, tvOS, and Windows. |\n| `CrissCross.Maui.UI` | `net9.0`, `net10.0`, plus MAUI platform TFMs for Android, iOS, Mac Catalyst, macOS, tvOS, and Windows. This project is currently marked `IsPackable=false` in the project file. |\n| `CrissCross.WinForms` | `net472`, `net481`, `net8.0-windows10.0.19041.0`, `net9.0-windows10.0.19041.0`, `net10.0-windows10.0.19041.0`. |\n| `CrissCross.WPF` | `net472`, `net481`, `net8.0-windows10.0.19041.0`, `net9.0-windows10.0.19041.0`, `net10.0-windows10.0.19041.0`. |\n| `CrissCross.WPF.Plot` | `net472`, `net481`, `net8.0-windows10.0.19041.0`, `net9.0-windows10.0.19041.0`, `net10.0-windows10.0.19041.0`. |\n| `CrissCross.WPF.UI` | `net472`, `net481`, `net8.0-windows10.0.19041.0`, `net9.0-windows10.0.19041.0`, `net10.0-windows10.0.19041.0`. |\n| `CrissCross.WPF.WebView2` | `net472`, `net481`, `net8.0-windows`, `net9.0-windows`, `net10.0-windows`. |\n\n## Gallery Projects\n\nRun the galleries:\n\n```powershell\ndotnet run --project src/CrissCross.WPF.UI.Gallery/CrissCross.WPF.UI.Gallery.csproj\ndotnet run --project src/CrissCross.Avalonia.UI.Gallery/CrissCross.Avalonia.UI.Gallery.csproj\ndotnet run --project src/CrissCross.Maui.UI.Gallery/CrissCross.Maui.UI.Gallery.csproj -f net10.0-windows10.0.19041.0\n```\n\n## Package Installation\n\nUse NuGet packages where they are published, or project references when consuming the libraries from this repository.\n\n```powershell\ndotnet add package CrissCross\ndotnet add package CrissCross.WPF\ndotnet add package CrissCross.WPF.UI\ndotnet add package CrissCross.WPF.Plot\ndotnet add package CrissCross.WPF.WebView2\ndotnet add package CrissCross.Avalonia\ndotnet add package CrissCross.Avalonia.UI\ndotnet add package CrissCross.MAUI\ndotnet add package CrissCross.WinForms\n```\n\nFor `CrissCross.Maui.UI`, reference the project directly while it remains non-packable:\n\n```xml\n\u003cProjectReference Include=\"..\\CrissCross.Maui.UI\\CrissCross.Maui.UI.csproj\" /\u003e\n```\n\n## ReactiveUI Startup\n\nCrissCross relies on the ReactiveUI app builder and Splat service locator registrations used by the platform packages. Each platform package supplies the platform-specific host; the view models can stay in shared projects.\n\nWPF:\n\n```csharp\nusing CrissCross.WPF;\nusing ReactiveUI.Builder;\n\npublic partial class App\n{\n    protected override void OnStartup(StartupEventArgs e)\n    {\n        base.OnStartup(e);\n\n        RxAppBuilder.CreateReactiveUIBuilder()\n            .WithWpf()\n            .BuildApp();\n    }\n}\n```\n\nAvalonia:\n\n```csharp\nusing Avalonia;\nusing ReactiveUI.Avalonia;\n\ninternal sealed class Program\n{\n    public static void Main(string[] args)\n        =\u003e BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);\n\n    public static AppBuilder BuildAvaloniaApp()\n        =\u003e AppBuilder.Configure\u003cApp\u003e()\n            .UsePlatformDetect()\n            .WithInterFont()\n            .LogToTrace()\n            .UseReactiveUI(_ =\u003e { });\n}\n```\n\nMAUI:\n\n```csharp\nusing CrissCross.MAUI;\nusing CrissCross.Maui.UI;\nusing ReactiveUI;\nusing ReactiveUI.Builder;\n\npublic static class MauiProgram\n{\n    public static MauiApp CreateMauiApp()\n    {\n        var builder = MauiApp.CreateBuilder();\n\n        builder\n            .UseMauiApp\u003cApp\u003e()\n            .UseCrissCrossMauiUi();\n\n        return builder.Build();\n    }\n}\n\npublic partial class App : Application\n{\n    public App()\n    {\n        InitializeComponent();\n        Resources.UseCrissCrossMauiUiResources();\n        RxAppBuilder.CreateReactiveUIBuilder().WithMaui().BuildApp();\n        MainPage = new AppShell();\n    }\n}\n```\n\nWinForms:\n\n```csharp\nusing CrissCross.WinForms;\nusing ReactiveUI.Builder;\n\nApplicationConfiguration.Initialize();\n\nRxAppBuilder.CreateReactiveUIBuilder()\n    .WithWinForms()\n    .BuildApp();\n\nApplication.Run(new MainForm());\n```\n\n## Core Package: CrissCross\n\n`CrissCross` is the shared foundation used by every platform package. It contains no concrete WPF, Avalonia, MAUI, or WinForms controls.\n\n### Core Concepts\n\n| Feature | Types | Use |\n| --- | --- | --- |\n| Reactive base object | `RxObject`, `IRxObject`, `RxObjectMixins` | Base class and helpers for ReactiveUI view models with navigation lifecycle flags. |\n| View-model routed hosts | `IViewModelRoutedViewHost`, `ViewModelRoutedViewHostMixins` | Platform-neutral navigation contract used by WPF, Avalonia, MAUI, and WinForms hosts. |\n| Navigation lifecycle | `IAmBuilt`, `ISetNavigation`, `INotifiyNavigation`, `IUseNavigation`, `IUseHostedNavigation`, `INotifiyRoutableViewModel` | Optional interfaces for setup, hosted navigation, and navigation notifications. |\n| Navigation events | `IViewModelNavigationBaseEventArgs`, `IViewModelNavigationEventArgs`, `IViewModelNavigatingEventArgs`, `ViewModelNavigationBaseEventArgs`, `ViewModelNavigationEventArgs`, `ViewModelNavigatingEventArgs` | Event argument models for navigating, navigated, and lifecycle notifications. |\n| Bidirectional navigation | `INavigationRegistry`, `NavigationRegistry`, `IBidirectionalNavigator`, `NavigationRequest`, `NavigationResolution`, `NavigationResolution\u003cTViewModel,TView\u003e`, `NavigationJournal` | Resolve views from view models and view models from views, then maintain journal history. |\n| Navigation exceptions | `NavigationRegistrationException`, `NavigationResolutionException` | Explicit errors for duplicate, missing, or invalid navigation registrations. |\n| Navigation metadata | `NavigationType`, `NavigationSourceKind` | Describes normal, reset, and back navigation plus origin source. |\n\n### RxObject\n\nUse `RxObject` for view models that need ReactiveUI notifications, setup completion, and navigation lifecycle support.\n\n```csharp\nusing CrissCross;\n\npublic sealed class DashboardViewModel : RxObject\n{\n    private string title = \"Dashboard\";\n\n    public string Title\n    {\n        get =\u003e title;\n        set =\u003e this.RaiseAndSetIfChanged(ref title, value);\n    }\n\n    public DashboardViewModel()\n    {\n        BuildComplete();\n    }\n}\n```\n\n`BuildComplete()` marks construction as complete. `SetupComplete()` marks the view model as ready for navigation. Controls and hosts use these flags to avoid acting on partially constructed view models.\n\n### View-Model Navigation Helpers\n\n`ViewModelRoutedViewHostMixins` provides extension methods over `IViewModelRoutedViewHost`:\n\n| Method | Use |\n| --- | --- |\n| `NavigateToView\u003cTViewModel\u003e()` | Create and navigate to a registered or located view model type. |\n| `NavigateToView(Type)` | Navigate to a view model type selected at runtime. |\n| `NavigateToViewAndClearHistory\u003cTViewModel\u003e()` | Navigate and clear the host history. |\n| `NavigateBack()` | Navigate to the previous view model when available. |\n| `CanNavigateBack()` | Returns whether the host can navigate back. |\n| `ClearHistory()` | Clear the host navigation journal. |\n| `WhenSetup()` | Returns an observable that completes when host setup is complete. |\n| `SetMainNavigationHost(...)` | Registers a platform host as the main navigation surface. |\n| `WhenNavigating(...)`, `WhenNavigatedTo(...)`, `WhenNavigatedFrom(...)` | Hooks view or view-model navigation lifecycle callbacks. |\n\nExample:\n\n```csharp\npublic sealed class ShellViewModel : RxObject, IUseHostedNavigation\n{\n    public ReactiveCommand\u003cUnit, Unit\u003e OpenSettings { get; }\n\n    public ShellViewModel()\n    {\n        OpenSettings = ReactiveCommand.Create(() =\u003e\n        {\n            this.NavigateToView\u003cSettingsViewModel\u003e();\n        });\n\n        BuildComplete();\n    }\n}\n```\n\n### Navigation Registry\n\nUse `NavigationRegistry` when you need explicit view-model to view registrations or bidirectional resolution independent of a platform host.\n\n```csharp\nusing CrissCross;\nusing Microsoft.Extensions.DependencyInjection;\nusing System.Reactive.Linq;\n\nvar services = new ServiceCollection();\n\nservices.AddSingleton\u003cHomeViewModel\u003e();\nservices.AddTransient\u003cHomeView\u003e();\n\nvar registry = new NavigationRegistry()\n    .Register\u003cHomeViewModel, HomeView\u003e(\n        sp =\u003e sp.GetRequiredService\u003cHomeViewModel\u003e(),\n        sp =\u003e sp.GetRequiredService\u003cHomeView\u003e(),\n        contract: \"home\");\n\nservices.AddSingleton\u003cINavigationRegistry\u003e(registry);\n```\n\nResolve a request:\n\n```csharp\nvar provider = services.BuildServiceProvider();\nvar registry = provider.GetRequiredService\u003cINavigationRegistry\u003e();\n\nvar resolution = await registry\n    .CreateNavigator(provider)\n    .NavigateViewModel\u003cHomeViewModel, HomeView\u003e(contract: \"home\")\n    .FirstAsync();\n\nvar viewModel = resolution.ViewModel;\nvar view = resolution.View;\n```\n\n### Shared State Models\n\nThe core package includes state objects used by WPF, Avalonia, and MAUI controls. Prefer these models in shared view models so the same feature can be rendered by each UI stack.\n\nMost state models are immutable snapshots. When a value changes, assign a new state instance to your view-model property and raise property change notification instead of mutating nested properties.\n\n| Feature | Types |\n| --- | --- |\n| Busy and command state | `BusyOperation`, `CommandButtonState`, `CommandButtonStatus` |\n| Search and paging | `SearchQueryState`, `PaginationState`, `PageRequest` |\n| Filtering | `DataFilterPanelState`, `FilterDescriptor`, `FilterExpression`, `FilterToken`, `FilterOperator`, `FilterEditorKind` |\n| Chips and segmented selection | `ChipModel`, `ChipGroupState`, `ChipGroupSelectionMode`, `SegmentItem`, `SegmentedSelectionState` |\n| Workflow steps | `StepDescriptor`, `StepperState`, `StepStatus`, `StepperOrientation` |\n| Validation and forms | `ValidationMessage`, `ValidationSummaryState`, `ValidationSeverity`, `FormFieldState`, `ReactiveFormField` state models |\n| Property editing | `PropertyDescriptorModel`, `PropertyDescriptorGroup`, `PropertyGridState`, `PropertyEditorKind` |\n| Date and time ranges | `DateTimeRange`, `DateTimeRangePreset`, `DateTimeRangePresetDefinition` |\n| Theme preference | `ThemeChoice`, `ThemePreferenceState` |\n| Empty states | `EmptyStateModel`, `EmptyStateVariant` |\n\n### Filtering Model\n\n`FilterOperator` values:\n\n```text\nEquals\nNotEquals\nContains\nStartsWith\nEndsWith\nGreaterThan\nGreaterThanOrEqual\nLessThan\nLessThanOrEqual\nBetween\n```\n\n`FilterEditorKind` values:\n\n```text\nText\nNumber\nBoolean\nEnum\nDate\nDateTime\nDateRange\nCustom\n```\n\nExample:\n\n```csharp\nvar descriptors = new[]\n{\n    new FilterDescriptor(\n        key: \"area\",\n        displayName: \"Area\",\n        editorKind: FilterEditorKind.Enum,\n        choices: new object?[] { \"North\", \"South\" })\n};\n\nvar expressions = new[]\n{\n    new FilterExpression(\"area\", FilterOperator.Equals, \"North\")\n};\n\nvar state = new DataFilterPanelState(descriptors, expressions);\nvar query = state.ToSearchQueryState(text: \"pump alarm\", resultCount: 7);\n```\n\n### Property Editing Model\n\n`PropertyEditorKind` values:\n\n```text\nText\nNumber\nBoolean\nEnum\nColor\nDate\nDateTime\nCommand\nCustom\n```\n\nExample:\n\n```csharp\nvar descriptors = new[]\n{\n    new PropertyDescriptorModel(\n        key: \"name\",\n        displayName: \"Name\",\n        category: \"Machine\",\n        editorKind: PropertyEditorKind.Text,\n        value: \"Pump 12\",\n        originalValue: \"Pump 12\"),\n    new PropertyDescriptorModel(\n        key: \"enabled\",\n        displayName: \"Enabled\",\n        category: \"Machine\",\n        editorKind: PropertyEditorKind.Boolean,\n        value: true,\n        originalValue: true)\n};\n\nvar inspector = new PropertyGridState(descriptors);\n```\n\n## CrissCross.WPF\n\n`CrissCross.WPF` supplies WPF navigation hosts and WPF-specific integration for core view-model routing.\n\n### WPF XML Namespace\n\n```xml\nxmlns:rxNav=\"https://github.com/reactivemarbles/CrissCross\"\n```\n\n### App Resources\n\nLoad the base WPF resource dictionary when using WPF navigation controls:\n\n```xml\n\u003cApplication\n    x:Class=\"Example.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rxNav=\"https://github.com/reactivemarbles/CrissCross\"\n    StartupUri=\"MainWindow.xaml\"\u003e\n    \u003cApplication.Resources\u003e\n        \u003cResourceDictionary\u003e\n            \u003cResourceDictionary.MergedDictionaries\u003e\n                \u003crxNav:CrissCrossWpfDictionary /\u003e\n            \u003c/ResourceDictionary.MergedDictionaries\u003e\n        \u003c/ResourceDictionary\u003e\n    \u003c/Application.Resources\u003e\n\u003c/Application\u003e\n```\n\n### NavigationWindow\n\nUse `NavigationWindow` as a XAML shell that hosts view-model navigation. `NavigationWindow\u003cTViewModel\u003e` is available when the shell type itself should carry a strongly typed view model.\n\n```xml\n\u003crxNav:NavigationWindow\n    x:Class=\"Example.MainWindow\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rxNav=\"https://github.com/reactivemarbles/CrissCross\"\n    Title=\"Example\"\n    Width=\"1000\"\n    Height=\"700\"\n    NavigateBackIsEnabled=\"True\" /\u003e\n```\n\n```csharp\nusing CrissCross;\nusing CrissCross.WPF;\n\npublic partial class MainWindow : NavigationWindow\n{\n    public MainWindow()\n    {\n        InitializeComponent();\n    }\n}\n```\n\nKey members:\n\n| Member | Use |\n| --- | --- |\n| `NavigationFrame` | The contained `ViewModelRoutedViewHost`. |\n| `NavigateBackIsEnabled` | Shows or enables back navigation integration. |\n| `CanNavigateBack` | Indicates whether history contains a previous view model. |\n| `Transition` | Controls host transition behavior where supported. |\n\n### ViewModelRoutedViewHost\n\n`ViewModelRoutedViewHost` is the WPF control that displays the view located for the current view model.\n\n```xml\n\u003crxNav:ViewModelRoutedViewHost\n    HostName=\"Main\"\n    NavigateBackIsEnabled=\"True\" /\u003e\n```\n\nKey members:\n\n| Member | Use |\n| --- | --- |\n| `HostName` | Names the host when multiple navigation surfaces exist. |\n| `NavigationStack` | Read-only navigation journal. |\n| `CanNavigateBack` | Returns whether back navigation is possible. |\n| `ViewLocator` | ReactiveUI view locator used to resolve views. |\n| `Navigate\u003cTViewModel\u003e()` | Navigate to a new view model instance. |\n| `Navigate(IRxObject)` | Navigate to an existing view model. |\n| `NavigateAndReset\u003cTViewModel\u003e()` | Navigate and reset history. |\n| `NavigateBack()` | Pop history and show the previous view. |\n| `ClearHistory()` | Clear host history. |\n| `Refresh()` | Re-resolve current view. |\n| `Setup()` | Complete host setup and notify view models. |\n\n### Single Instance Helper\n\n`Make.SingleInstance` prevents multiple copies of an application from running and activates the existing main window when a second instance starts.\n\n```csharp\nusing System.Windows;\n\npublic partial class App\n{\n    protected override void OnStartup(StartupEventArgs e)\n    {\n        if (!Make.SingleInstance(\"ExampleApp\"))\n        {\n            return;\n        }\n\n        base.OnStartup(e);\n    }\n}\n```\n\n### NavigationWebView\n\n`NavigationWebView` combines a WebView2 browser surface with a WPF navigation overlay. Use it when a WPF app needs web content plus CrissCross view-model navigation hosted over the browser.\n\n```xml\n\u003crxNav:NavigationWebView\n    Source=\"https://example.com\"\n    NavigateBackIsEnabled=\"True\" /\u003e\n```\n\nImportant members:\n\n| Member | Use |\n| --- | --- |\n| `Source` | WebView2 URI source. |\n| `ZoomFactor` | Browser zoom factor. |\n| `Content` | Overlay WPF content. |\n| `NavigationFrame` | CrissCross navigation host. |\n| `NavigateBackIsEnabled` | Enables overlay back navigation. |\n| `EnsureCoreWebView2Async()` | Initializes WebView2. |\n| `ExecuteScriptAsync(string)` | Runs JavaScript in WebView2. |\n| `NavigateToString(string)` | Loads HTML content. |\n| `GoBack()`, `GoForward()`, `Reload()`, `Stop()` | Browser navigation commands. |\n\n## CrissCross.Avalonia\n\n`CrissCross.Avalonia` supplies Avalonia navigation windows, user controls, routed view hosts, and reactive transition content.\n\n### Avalonia XML Namespace\n\n```xml\nxmlns:rxNav=\"https://github.com/reactivemarbles/CrissCross\"\n```\n\n### App Styles\n\n```xml\n\u003cApplication\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x:Class=\"Example.App\"\u003e\n    \u003cApplication.Styles\u003e\n        \u003cFluentTheme /\u003e\n        \u003cStyleInclude Source=\"avares://CrissCross.Avalonia/Themes/Index.axaml\" /\u003e\n    \u003c/Application.Styles\u003e\n\u003c/Application\u003e\n```\n\n### NavigationWindow\n\n```xml\n\u003crxNav:NavigationWindow\n    x:Class=\"Example.MainWindow\"\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rxNav=\"https://github.com/reactivemarbles/CrissCross\"\n    Width=\"1000\"\n    Height=\"700\"\n    Title=\"Example\" /\u003e\n```\n\n```csharp\nusing CrissCross.Avalonia;\n\npublic partial class MainWindow : NavigationWindow\n{\n    public MainWindow()\n    {\n        InitializeComponent();\n    }\n}\n```\n\n### NavigationUserControl\n\nUse `NavigationUserControl` or `NavigationUserControl\u003cTViewModel\u003e` for nested navigation surfaces:\n\n```xml\n\u003crxNav:NavigationUserControl\n    x:Class=\"Example.Views.WorkspaceView\"\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rxNav=\"https://github.com/reactivemarbles/CrissCross\"\u003e\n    \u003crxNav:ViewModelRoutedViewHost HostName=\"Workspace\" /\u003e\n\u003c/rxNav:NavigationUserControl\u003e\n```\n\n### ViewModelRoutedViewHost\n\n`ViewModelRoutedViewHost` is the Avalonia equivalent of the WPF host. It exposes the same core navigation surface:\n\n| Member | Use |\n| --- | --- |\n| `HostName` | Names the host. |\n| `NavigationStack` | Navigation journal. |\n| `CanNavigateBack` | Indicates whether back navigation is available. |\n| `Navigate\u003cTViewModel\u003e()` | Navigate by view model type. |\n| `Navigate(IRxObject)` | Navigate to an existing view model. |\n| `NavigateAndReset\u003cTViewModel\u003e()` | Navigate and clear history. |\n| `NavigateBack()` | Navigate back. |\n| `ClearHistory()` | Clear journal history. |\n| `Refresh()` | Re-resolve current view. |\n| `Setup()` | Complete setup. |\n\n### ReactiveTransitioningContentControl\n\n`ReactiveTransitioningContentControl` cross-fades between presenters when content changes. Use it for animated route or panel transitions.\n\n```xml\n\u003crxNav:ReactiveTransitioningContentControl Content=\"{Binding CurrentPage}\" /\u003e\n```\n\n## CrissCross.MAUI\n\n`CrissCross.MAUI` supplies a MAUI Shell implementation that behaves like the same view-model routed host used by the desktop packages.\n\n### Register MAUI\n\n```csharp\nRxAppBuilder.CreateReactiveUIBuilder()\n    .WithMaui()\n    .BuildApp();\n```\n\n### NavigationShell\n\n`NavigationShell` derives from `Microsoft.Maui.Controls.Shell` and implements `IViewModelRoutedViewHost`.\n\n```xml\n\u003crxNav:NavigationShell\n    x:Class=\"Example.AppShell\"\n    xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\n    xmlns:rxNav=\"https://github.com/reactivemarbles/CrissCross\"\u003e\n\u003c/rxNav:NavigationShell\u003e\n```\n\n```csharp\npublic partial class AppShell : NavigationShell\n{\n    public AppShell()\n    {\n        InitializeComponent();\n    }\n}\n```\n\nKey members:\n\n| Member | Use |\n| --- | --- |\n| `Name` | Shell name. |\n| `HostName` | Host key used by navigation-aware view models. |\n| `NavigationStack` | View-model navigation history. |\n| `CanNavigateBack` | Indicates whether back navigation is possible. |\n| `CanNavigateBackObservable` | Observable back-navigation state. |\n| `NavigateBackIsEnabled` | Enables shell back behavior. |\n| `RequiresSetup` | Indicates whether setup is still required. |\n| `ViewLocator` | ReactiveUI view locator used to resolve views. |\n| `Navigate\u003cTViewModel\u003e()` | Navigate by view model type. |\n| `Navigate(IRxObject)` | Navigate to an existing view model. |\n| `NavigateAndReset\u003cTViewModel\u003e()` | Navigate and reset stack. |\n| `NavigateBack()` | Pop shell navigation. |\n| `ClearHistory()` | Clear view-model history. |\n| `Refresh()` | Re-resolve current route. |\n| `Setup()` | Complete setup and register hosted navigation. |\n| `Dispose()` | Release subscriptions and host state. |\n\n## CrissCross.WinForms\n\n`CrissCross.WinForms` supplies WinForms hosts for the same view-model routing model.\n\n### NavigationForm\n\nUse `NavigationForm` or `NavigationForm\u003cTViewModel\u003e` as the main form:\n\n```csharp\nusing CrissCross.WinForms;\n\npublic sealed class MainForm : NavigationForm\u003cMainViewModel\u003e\n{\n    public MainForm()\n    {\n        Text = \"Example\";\n        Width = 1000;\n        Height = 700;\n\n        NavigateBackIsEnabled = true;\n    }\n}\n```\n\nKey members:\n\n| Member | Use |\n| --- | --- |\n| `NavigationFrame` | Contained `ViewModelRoutedViewHost`. |\n| `NavigationFrameDock` | WinForms docking mode for the host. |\n| `NavigateBackIsEnabled` | Enables hosted back behavior. |\n| `CanNavigateBack` | Indicates whether the host can go back. |\n\n### ViewModelRoutedViewHost\n\nThe WinForms host exposes the same core navigation methods as WPF and Avalonia. It resolves ReactiveUI views and places them into the host control.\n\n```csharp\nvar host = new ViewModelRoutedViewHost\n{\n    Dock = DockStyle.Fill,\n    HostName = \"Main\"\n};\n\nControls.Add(host);\nhost.Setup();\nhost.Navigate\u003cHomeViewModel\u003e();\n```\n\n## CrissCross.WPF.UI\n\n`CrissCross.WPF.UI` is the primary themed UI package. It contains WPF control wrappers, Fluent-style shell controls, feature controls backed by core state models, resource dictionaries, services, and theme managers.\n\n### WPF UI XML Namespace\n\nUse the CrissCross UI namespace for CrissCross themed controls:\n\n```xml\nxmlns:ui=\"https://github.com/reactivemarbles/CrissCross.ui\"\n```\n\nThe WPF UI assembly maps this namespace to CrissCross controls and common WPF namespaces so application XAML can use a single `ui:` prefix for the themed CrissCross surface. The root `Application` and low-level WPF infrastructure still use the normal WPF XML namespace.\n\n### App Resources\n\nLoad controls and theme dictionaries once at application startup:\n\n```xml\n\u003cApplication\n    x:Class=\"Example.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:ui=\"https://github.com/reactivemarbles/CrissCross.ui\"\n    StartupUri=\"MainWindow.xaml\"\u003e\n    \u003cApplication.Resources\u003e\n        \u003cResourceDictionary\u003e\n            \u003cResourceDictionary.MergedDictionaries\u003e\n                \u003cui:ControlsDictionary /\u003e\n                \u003cui:ThemesDictionary Theme=\"Dark\" /\u003e\n            \u003c/ResourceDictionary.MergedDictionaries\u003e\n        \u003c/ResourceDictionary\u003e\n    \u003c/Application.Resources\u003e\n\u003c/Application\u003e\n```\n\n`ThemesDictionary` accepts `Light`, `Dark`, and `HighContrast`.\n\n### Host Builder Setup\n\n`HostBuilderMixins` wires common WPF UI services and navigation hosts into Microsoft.Extensions.Hosting.\n\n```csharp\nusing CrissCross.WPF.UI;\nusing Microsoft.Extensions.Hosting;\n\nvar host = Host.CreateDefaultBuilder(args)\n    .ConfigureCrissCrossForPageNavigation\u003cMainWindow, HomePage\u003e()\n    .Build();\n\nawait host.StartAsync();\n```\n\nFor view-model navigation:\n\n```csharp\nvar host = Host.CreateDefaultBuilder(args)\n    .ConfigureCrissCrossForViewModelNavigation\u003cMainWindow, ShellViewModel\u003e()\n    .Build();\n```\n\n### Services\n\n| Service | Implementation | Use |\n| --- | --- | --- |\n| `INavigationService` | `NavigationService` | Navigate `NavigationView` pages by type or string key, go back/forward, and navigate with hierarchy. |\n| `IPageService` | `PageService` | Resolve pages from dependency injection. |\n| `IContentDialogService` | `ContentDialogService` | Show `ContentDialog` instances from view models or services. |\n| `ISnackbarService` | `SnackbarService` | Show transient messages through a registered snackbar presenter. |\n| `IThemeService` | `ThemeService` | Read and apply app theme, system theme, and accent color. |\n| `ITaskBarService` | `TaskBarService` | Set Windows taskbar progress state and value. |\n| hosted app startup | `ApplicationHostService` | Starts the configured WPF main window from the generic host. |\n\nNavigation service example:\n\n```csharp\npublic sealed class ShellViewModel\n{\n    private readonly INavigationService navigation;\n\n    public ShellViewModel(INavigationService navigation)\n    {\n        this.navigation = navigation;\n    }\n\n    public void OpenSettings()\n    {\n        navigation.Navigate(typeof(SettingsPage));\n    }\n}\n```\n\nSnackbar example:\n\n```csharp\nsnackbarService.Show(\n    title: \"Saved\",\n    message: \"Changes have been written.\",\n    controlAppearance: ControlAppearance.Success,\n    icon: null,\n    timeout: TimeSpan.FromSeconds(3));\n```\n\nTheme example:\n\n```csharp\nthemeService.SetTheme(ApplicationTheme.Dark);\nthemeService.SetSystemAccent();\n```\n\n### Shell And Navigation Controls\n\n| Control | Use |\n| --- | --- |\n| `FluentWindow` | Window base with themed chrome and content integration. |\n| `FluentNavigationWindow` | Window with navigation layout and Fluent shell behavior. |\n| `ModernWindow` | Modern themed WPF window. |\n| `Window` | Themed WPF window wrapper. |\n| `TitleBar` | Custom title bar/chrome surface. |\n| `NavigationView` | Left/top navigation menu, content host, footer items, pane display modes, selection, and hierarchy. |\n| `NavigationViewItem` | Selectable navigation item. |\n| `NavigationViewItemHeader` | Navigation section header. |\n| `NavigationViewItemSeparator` | Navigation separator. |\n| `NavigationViewItemPresenter` | Internal presenter for navigation items. |\n| `NavigationViewItemAutomationPeer` | Automation peer for navigation items. |\n| `NavigationViewItemTemplateSettings` | Template state for navigation items. |\n| `NavigationViewItemsFactory` | Creates navigation item containers. |\n| `NavigationViewList` | Internal item list used by `NavigationView`. |\n| `NavigationViewBackButton` | Back button integrated with navigation state. |\n| `BreadcrumbBar` | Hierarchical breadcrumb path with selected item navigation. |\n| `ClientAreaBorder` | Themed border used around custom chrome client content. |\n| `Frame` | Themed frame for page content. |\n| `Page` | Themed WPF page base. |\n| `NavigationUserControl` | User control base for navigation-aware content. |\n| `AppBar`, `AppBarButton`, `AppBarSeparator`, `AppBarToggleButton`, `AppBarElementContainer` | Command bar and app bar controls. |\n| `TabControl`, `TabView` | Themed tabbed navigation and tabbed document surfaces. |\n| `LoadingScreen` | Startup or long-running loading surface. |\n\nNavigationView example:\n\n```xml\n\u003cui:FluentNavigationWindow\n    x:Class=\"Example.MainWindow\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:local=\"clr-namespace:Example.Views\"\n    xmlns:ui=\"https://github.com/reactivemarbles/CrissCross.ui\"\n    Title=\"Example\"\n    Width=\"1100\"\n    Height=\"750\"\u003e\n    \u003cui:NavigationView x:Name=\"RootNavigation\"\u003e\n        \u003cui:NavigationView.MenuItems\u003e\n            \u003cui:NavigationViewItem Content=\"Home\" TargetPageType=\"{x:Type local:HomePage}\" /\u003e\n            \u003cui:NavigationViewItem Content=\"Settings\" TargetPageType=\"{x:Type local:SettingsPage}\" /\u003e\n        \u003c/ui:NavigationView.MenuItems\u003e\n    \u003c/ui:NavigationView\u003e\n\u003c/ui:FluentNavigationWindow\u003e\n```\n\n### Primitive, Layout, And Text Controls\n\n| Control | Use |\n| --- | --- |\n| `AccessText` | Themed access-key text. |\n| `Anchor` | Link-like navigation or command element. |\n| `Border` | Themed border wrapper. |\n| `Button` | Themed button. |\n| `Grid` | Themed grid wrapper. |\n| `GroupBox` | Grouped content container. |\n| `HyperlinkButton` | Button styled and behaving like a link. |\n| `ItemsControl` | Themed item host. |\n| `Label` | Themed label. |\n| `ScrollBar`, `ScrollViewer` | Themed scrolling controls. |\n| `DynamicScrollBar`, `DynamicScrollViewer` | Scroll controls with dynamic visibility and layout behavior. |\n| `Separator` | Themed separator line. |\n| `StackPanel` | Themed stack panel wrapper. |\n| `StatusBar` | Status area container. |\n| `TextBlock` | Themed text display. |\n| `ToolBar` | Themed toolbar container. |\n| `ToolTip` | Themed tooltip. |\n\n### Input And Editor Controls\n\n| Control | Use |\n| --- | --- |\n| `TextBox` | Themed text input with icon and placeholder support where available. |\n| `PasswordBox` | Themed password input. |\n| `NumberBox` | Numeric input. |\n| `NumberPad` | On-screen numeric keypad. |\n| `NumericPushButton` | Numeric increment/decrement command button. |\n| `ComboBox` | Themed selection drop-down. |\n| `AutoSuggestBox` | Text input with suggestion list and query submission. |\n| `SearchBox` | Search-specific input bound to `SearchQueryState`. |\n| `DatePicker`, `TimePicker`, `DateTimePicker`, `CalendarDatePicker` | Date and time selection controls. |\n| `DateTimeRangePicker` | Range and preset selection backed by `DateTimeRange`. |\n| `Calendar` | Themed calendar. |\n| `Slider`, `SquareSlider`, `HueSlider` | Numeric and color-channel sliders. |\n| `CheckBox`, `CheckBoxModern` | Boolean selection controls. |\n| `RadioButton` | Exclusive option selection. |\n| `ToggleButton`, `ToggleSwitch` | Toggle state controls. |\n| `ColorPicker`, `ColorSelector` | Color selection UI. |\n| `RatingControl` | Rating value selector. |\n| `ThumbRate` | Thumb-based rating or preference control. |\n\n### Command Controls\n\n| Control | Use |\n| --- | --- |\n| `CommandButton` | Button bound to `CommandButtonState`, including executing and progress states. |\n| `AsyncCommandButton` | Async command button surface derived from `CommandButton`. |\n| `DropDownButton` | Button with flyout menu/content. |\n| `SplitButton` | Primary command plus secondary flyout. |\n| `ToggleButton` | Toggle command state. |\n| `HyperlinkButton` | Link-styled command. |\n\n### Data, Lists, And Virtualization\n\n| Control | Use |\n| --- | --- |\n| `DataGrid` | Themed tabular data grid. |\n| `DataPager` | Paging command surface backed by `PaginationState`. |\n| `DataFilterPanel` | Filter builder and query submission control. |\n| `FilterBar` | Active filter chips and clear/remove commands. |\n| `GridView` | Grid item presentation. |\n| `ListBox`, `ListView` | Themed list selection and display. |\n| `TreeView` | Hierarchical item view. |\n| `TreeGrid` | Hierarchical tabular data. |\n| `VirtualizingItemsControl` | Virtualized items host. |\n| `VirtualizingWrapPanel` | Virtualized wrapping panel. |\n| `VirtualizingGridView` | Virtualized grid display. |\n| `PropertyGridLite` | Property editor generated from `PropertyGridState`. |\n| `ReactiveFormField` | Field container driven by validation and form state. |\n| `ValidationSummary` | Validation message list backed by `ValidationSummaryState`. |\n\n### Feedback, Surfaces, And Media\n\n| Control | Use |\n| --- | --- |\n| `AlarmBanner`, `Alarms` | Alarm status and alarm-list presentation controls. |\n| `Arc` | Arc shape/control for indicators and visuals. |\n| `Badge`, `InfoBadge` | Count/status badges. |\n| `BusyOverlay` | Overlay for cancellable or long-running work. |\n| `Card`, `CardAction`, `CardColor`, `CardControl`, `CardExpander` | Themed card surfaces and actions. |\n| `ContentDialog` | Modal dialog surface. |\n| `ContextMenu`, `Menu` | Menu surfaces. |\n| `EmptyState` | Empty, loading, error, or success placeholder state. |\n| `Expander`, `CardExpander` | Collapsible content. |\n| `Flyout` | Lightweight popup/flyout content. |\n| `Gauges` | Gauge indicator controls. |\n| `GifImage`, `Image`, `PersonPicture` | Media and avatar controls. |\n| `InfoBar` | Inline status message with severity. |\n| `MessageBox`, `MessageBoxAsync` | Synchronous and asynchronous message dialogs. |\n| `ProgressBar`, `ProgressRing` | Progress indicators. |\n| `RichTextBox` | Rich text editing/display. |\n| `Snackbar` | Transient notification surface. |\n\n### Icons And Appearance\n\n| Type | Use |\n| --- | --- |\n| `IconElement` | Base type for icon elements. |\n| `IconSource` | Source model for icon creation. |\n| `FontIcon`, `FontIconSource` | Font glyph icons. |\n| `SymbolIcon`, `SymbolIconSource` | Symbol icons. |\n| `ImageIcon`, `ImageIconSource` | Image-backed icons. |\n| `SymbolGlyph`, `SymbolRegular`, `SymbolFilled` | Built-in symbol glyph definitions. |\n| `IAppearanceControl` | Contract for controls that expose appearance. |\n| `IIconControl` | Contract for controls exposing an icon. |\n| `IThemeControl` | Contract for theme-aware controls. |\n| `ControlAppearance` | Appearance enum used by many controls. |\n| `ColorPaletteResources` | Theme color palette resources. |\n\n### Feature Controls\n\nThese controls share their view-model state with Avalonia and MAUI equivalents.\n\n| Control | Primary state | Important members |\n| --- | --- | --- |\n| `BusyOverlay` | `BusyOperation` | Shows busy text/progress over existing content. |\n| `CommandButton` | `CommandButtonState` | `State`, `IsExecuting`, `Progress`, `ExecutingContent`, `ErrorContent`. |\n| `SearchBox` | `SearchQueryState` | `Text`, `PlaceholderText`, `QueryState`, `SearchCommand`, `ClearCommand`. `SearchCommand` receives the current text as a string command parameter. |\n| `FilterBar` | `SearchQueryState` | `QueryState`, `RemoveFilterCommand`, `ClearAllCommand`. |\n| `DataFilterPanel` | `DataFilterPanelState` | `FilterState`, `SearchText`, `ResultCount`, `SubmittedQueryState`, `ApplyFiltersCommand`, `ClearFiltersCommand`, `AddFilterCommand`, `RemoveFilterCommand`. |\n| `DataPager` | `PaginationState`, `PageRequest` | `PaginationState`, `CurrentRequest`, `PageRequestCommand`, `SortKey`, `SortDescending`, `QueryState`. |\n| `DateTimeRangePicker` | `DateTimeRange` | `Start`, `End`, `CurrentRange`, `SelectedPreset`, `RangeLabel`, `ReferenceTime`, range commands. |\n| `ThemeSwitcher` | `ThemePreferenceState` | `SelectedChoice`, `SystemChoice`, `SupportsHighContrast`, `CurrentState`, `ThemeService`, `ThemeChangedCommand`. |\n| `Chip`, `ChipGroup` | `ChipModel`, `ChipGroupState` | Selection, close/remove, icon, and grouping state. |\n| `SegmentedControl` | `SegmentedSelectionState` | `SelectionState`, `SelectedKey`, `SelectionChangedCommand`. |\n| `Stepper` | `StepperState` | `State`, `CurrentKey`, `StepRequestedCommand`, `FinishCommand`, `CancelCommand`. |\n| `ValidationSummary` | `ValidationSummaryState` | `SummaryState`, `NavigateToFieldCommand`. |\n| `PropertyGridLite` | `PropertyGridState` | `InspectorState`, `SearchText`, `CommitChangesCommand`, `ResetChangesCommand`. |\n| `ReactiveFormField` | `FormFieldState` | Field label, hint, validation messages, required state. |\n| `EmptyState` | `EmptyStateModel` | Title, description, icon, variant, primary action. |\n\n## CrissCross.Avalonia.UI\n\n`CrissCross.Avalonia.UI` mirrors the WPF UI package for Avalonia. It provides themed controls, feature controls, services, themes, and resources for Avalonia apps.\n\n### Avalonia UI XML Namespace\n\n```xml\nxmlns:ui=\"https://github.com/reactivemarbles/CrissCross.Avalonia.UI\"\n```\n\n### App Styles\n\nLoad Avalonia Fluent theme plus CrissCross UI styles:\n\n```xml\n\u003cApplication\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x:Class=\"Example.App\"\u003e\n    \u003cApplication.Styles\u003e\n        \u003cFluentTheme /\u003e\n        \u003cStyleInclude Source=\"avares://CrissCross.Avalonia/Themes/Index.axaml\" /\u003e\n        \u003cStyleInclude Source=\"avares://CrissCross.Avalonia.UI/Themes/Index.axaml\" /\u003e\n    \u003c/Application.Styles\u003e\n\u003c/Application\u003e\n```\n\n### Services\n\n| Service | Implementation | Use |\n| --- | --- | --- |\n| `INavigationService` | `NavigationService` | Navigate pages by type or string key, and move back/forward. |\n| `IPageService` | `PageService` | Resolve pages from dependency injection. |\n| `IContentDialogService` | `ContentDialogService` | Show content dialogs through a registered presenter. |\n| `ISnackbarService` | `SnackbarService` | Show transient notifications. |\n| `IThemeService` | `ThemeService` | Apply application, system, and accent themes. |\n| settings persistence | `IStore`, `JsonFileStore` | Store and retrieve JSON-backed app settings. |\n\nTheme helpers:\n\n| Type | Use |\n| --- | --- |\n| `ApplicationThemeManager` | Reads and applies app theme and accent color. |\n| `SystemThemeManager` | Reads and caches operating-system theme information. |\n\n### Avalonia Control Catalog\n\n`CrissCross.Avalonia.UI` contains Avalonia implementations of the same WPF UI control set, including:\n\n```text\nAccessText\nAlarmBanner\nAlarms\nAnchor\nAppBar\nArc\nAutoSuggestBox\nBadge\nBorder\nBreadcrumbBar\nBusyOverlay\nButton\nCalendar\nCalendarDatePicker\nCard\nCardAction\nCardColor\nCardControl\nCardExpander\nCheckBox\nCheckBoxModern\nChip\nChipGroup\nClientAreaBorder\nColorPicker\nColorSelector\nComboBox\nCommandButton\nContentDialog\nContextMenu\nDataFilterPanel\nDataGrid\nDataPager\nDatePicker\nDateTimePicker\nDateTimeRangePicker\nDropDownButton\nDynamicScrollBar\nDynamicScrollViewer\nEmptyState\nExpander\nFilterBar\nFluentNavigationWindow\nFluentWindow\nFlyout\nFrame\nGauges\nGifImage\nGrid\nGridView\nGroupBox\nHueSlider\nHyperlinkButton\nIconElement\nIconSource\nImage\nInfoBadge\nInfoBar\nItemsControl\nLabel\nListBox\nListView\nLoadingScreen\nMenu\nMenuItem\nMessageBox\nMessageBoxAsync\nModernWindow\nNavigationControls\nNavigationUserControl\nNavigationView\nNumberBox\nNumberPad\nNumericPushButton\nPage\nPasswordBox\nPersonPicture\nProgressBar\nProgressRing\nPropertyGridLite\nRadioButton\nRatingControl\nReactiveFormField\nRichTextBox\nScrollBar\nScrollViewer\nSearchBox\nSegmentedControl\nSeparator\nSlider\nSnackbar\nSplitButton\nSquareSlider\nStackPanel\nStatusBar\nStepper\nTabControl\nTabView\nTextBlock\nTextBox\nThemeSwitcher\nThumbRate\nTimePicker\nTitleBar\nToggleButton\nToggleSwitch\nToolBar\nToolTip\nTreeGrid\nTreeView\nValidationSummary\nVirtualizingGridView\nVirtualizingItemsControl\nVirtualizingWrapPanel\nWindow\n```\n\n### Avalonia Feature Controls\n\nThe Avalonia feature controls use the same core state models as WPF:\n\n| Control | Primary state | Important members |\n| --- | --- | --- |\n| `BusyOverlay` | `BusyOperation` | Busy text/progress over existing content. |\n| `CommandButton` | `CommandButtonState` | `State`, `IsExecuting`, `Progress`, `ExecutingContent`, `ErrorContent`. |\n| `SearchBox` | `SearchQueryState` | `Text`, `PlaceholderText`, `QueryState`, `SearchCommand`, `ClearCommand`. `SearchCommand` receives the current text as a string command parameter. |\n| `FilterBar` | `SearchQueryState` | `QueryState`, `RemoveFilterCommand`, `ClearAllCommand`. |\n| `DataFilterPanel` | `DataFilterPanelState` | `FilterState`, `SearchText`, `ResultCount`, `SubmittedQueryState`, filter commands. |\n| `DataPager` | `PaginationState`, `PageRequest` | Page move commands and query/sort request generation. |\n| `DateTimeRangePicker` | `DateTimeRange` | Start/end, presets, labels, and range commands. |\n| `ThemeSwitcher` | `ThemePreferenceState` | `SelectedChoice`, `SystemChoice`, `SupportsHighContrast`, `CurrentState`, `ThemeService`, `ThemeChangedCommand`. |\n| `Chip`, `ChipGroup` | `ChipModel`, `ChipGroupState` | Chip selection and grouping. |\n| `SegmentedControl` | `SegmentedSelectionState` | `SelectionState`, `SelectedKey`, `SelectionChangedCommand`. |\n| `Stepper` | `StepperState` | `State`, `CurrentKey`, step navigation commands. |\n| `ValidationSummary` | `ValidationSummaryState` | Validation message display and field navigation. |\n| `PropertyGridLite` | `PropertyGridState` | `InspectorState`, `SearchText`, commit/reset commands. |\n| `ReactiveFormField` | `FormFieldState` | Field label, hint, validation, and required state. |\n| `EmptyState` | `EmptyStateModel` | Title, description, icon, variant, and action. |\n\n### Avalonia Examples\n\nAuto suggest input:\n\n```xml\n\u003cui:AutoSuggestBox\n    ItemsSource=\"{Binding Suggestions}\"\n    Text=\"{Binding SearchText}\"\n    PlaceholderText=\"Start typing...\" /\u003e\n```\n\nSplit button:\n\n```xml\n\u003cui:SplitButton Content=\"Run\" Command=\"{Binding RunCommand}\"\u003e\n    \u003cui:SplitButton.Flyout\u003e\n        \u003cMenuFlyout\u003e\n            \u003cMenuItem Header=\"Run all\" Command=\"{Binding RunAllCommand}\" /\u003e\n            \u003cMenuItem Header=\"Run selected\" Command=\"{Binding RunSelectedCommand}\" /\u003e\n        \u003c/MenuFlyout\u003e\n    \u003c/ui:SplitButton.Flyout\u003e\n\u003c/ui:SplitButton\u003e\n```\n\nDate picker:\n\n```xml\n\u003cui:DatePicker SelectedDate=\"{Binding DueDate}\" /\u003e\n```\n\n## CrissCross.Maui.UI\n\n`CrissCross.Maui.UI` provides MAUI controls backed by the same core models used by WPF and Avalonia feature controls. This allows shared view models to drive native MAUI UI.\n\n### Register MAUI UI\n\n```csharp\nbuilder\n    .UseMauiApp\u003cApp\u003e()\n    .UseCrissCrossMauiUi();\n\npublic partial class App : Application\n{\n    public App()\n    {\n        InitializeComponent();\n        Resources.UseCrissCrossMauiUiResources();\n        MainPage = new AppShell();\n    }\n}\n```\n\nYou can also merge the XAML resource dictionary manually:\n\n```xml\n\u003cApplication\n    x:Class=\"Example.App\"\n    xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\n    xmlns:styles=\"clr-namespace:CrissCross.Maui.UI.Resources.Styles;assembly=CrissCross.Maui.UI\"\u003e\n    \u003cApplication.Resources\u003e\n        \u003cResourceDictionary\u003e\n            \u003cResourceDictionary.MergedDictionaries\u003e\n                \u003cstyles:CrissCrossMauiUi /\u003e\n            \u003c/ResourceDictionary.MergedDictionaries\u003e\n        \u003c/ResourceDictionary\u003e\n    \u003c/Application.Resources\u003e\n\u003c/Application\u003e\n```\n\n### MAUI UI Controls\n\nUse this XAML namespace for MAUI UI controls:\n\n```xml\nxmlns:ui=\"clr-namespace:CrissCross.Maui.UI.Controls;assembly=CrissCross.Maui.UI\"\n```\n\n| Control | Primary state | Important members |\n| --- | --- | --- |\n| `AsyncCommandButton` | command state | `Command`, `CancelCommand`, `CancelText`, async/cancel presentation. |\n| `BusyOverlay` | `BusyOperation` | Busy content overlay and progress state. |\n| `Chip` | `ChipModel` | Text, selected state, close/remove behavior. |\n| `ChipGroup` | `ChipGroupState` | Multiple chips with selection mode. |\n| `CommandButton` | `CommandButtonState` | `State`, `IsExecuting`, `Progress`, command presentation. |\n| `DataFilterPanel` | `DataFilterPanelState` | `FilterPanelState`, `ApplyFiltersCommand`. |\n| `DataPager` | `PaginationState`, `PageRequest` | `PaginationState`, `CurrentRequest`, `PageRequestCommand`, page commands. |\n| `DateTimeRangePicker` | `DateTimeRange` | `Range`, `ApplyRangeCommand`. |\n| `EmptyState` | `EmptyStateModel` | Empty/loading/error/success placeholder. |\n| `FilterBar` | `SearchQueryState` | `SearchState`, `ClearFiltersCommand`. |\n| `PropertyGridLite` | `PropertyGridState` | `PropertyGridState`, `UpdatePropertyCommand`. |\n| `ReactiveFormField` | `FormFieldState` | Field label, hint, required marker, validation messages. |\n| `SearchBox` | `SearchQueryState` | `Text`, `SearchState`, `SubmitCommand`, `SubmitSearch()`. |\n| `SegmentedControl` | `SegmentedSelectionState` | `State`, `SelectedKey`, `SelectionCommand`, `SelectSegment`. |\n| `Stepper` | `StepperState` | `StepperState`, `StepCommand`. |\n| `ThemeSwitcher` | `ThemePreferenceState` | `ThemeState`, `ChangeThemeCommand`. |\n| `ValidationSummary` | `ValidationSummaryState` | `SummaryState`. |\n\n### MAUI Examples\n\nSearch box:\n\n```xml\n\u003cui:SearchBox\n    Text=\"{Binding Search.Text}\"\n    SearchState=\"{Binding Search}\"\n    SubmitCommand=\"{Binding SubmitSearchCommand}\" /\u003e\n```\n\nData pager:\n\n```xml\n\u003cui:DataPager\n    PaginationState=\"{Binding Paging}\"\n    PageRequestCommand=\"{Binding PageRequestCommand}\" /\u003e\n```\n\nStepper:\n\n```xml\n\u003cui:Stepper\n    StepperState=\"{Binding WizardSteps}\"\n    StepCommand=\"{Binding StepCommand}\" /\u003e\n```\n\nTheme switcher:\n\n```xml\n\u003cui:ThemeSwitcher\n    ThemeState=\"{Binding ThemePreference}\"\n    ChangeThemeCommand=\"{Binding ChangeThemeCommand}\" /\u003e\n```\n\n## Cross-Platform Feature Patterns\n\nThe feature controls are designed so a shared view model can power WPF, Avalonia, and MAUI UI. Use the core state models as public properties and bind platform controls to those properties.\n\n```csharp\npublic sealed class OrdersViewModel : RxObject\n{\n    private SearchQueryState search = new();\n    private PaginationState paging = new(pageIndex: 0, pageSize: 25, totalItemCount: 0);\n\n    public SearchQueryState Search\n    {\n        get =\u003e search;\n        private set =\u003e this.RaiseAndSetIfChanged(ref search, value);\n    }\n\n    public PaginationState Paging\n    {\n        get =\u003e paging;\n        private set =\u003e this.RaiseAndSetIfChanged(ref paging, value);\n    }\n\n    public DataFilterPanelState Filters { get; } = new();\n    public ValidationSummaryState Validation { get; } = new(Array.Empty\u003cValidationMessage\u003e());\n\n    public ReactiveCommand\u003cPageRequest, Unit\u003e PageRequested { get; }\n\n    public OrdersViewModel()\n    {\n        PageRequested = ReactiveCommand.Create\u003cPageRequest\u003e(request =\u003e\n        {\n            Paging = new PaginationState(request.PageIndex, request.PageSize, Paging.TotalItemCount);\n        });\n\n        BuildComplete();\n    }\n}\n```\n\nWPF/Avalonia binding shape:\n\n```xml\n\u003cui:SearchBox QueryState=\"{Binding Search}\" /\u003e\n\u003cui:DataFilterPanel FilterState=\"{Binding Filters}\" /\u003e\n\u003cui:DataPager PaginationState=\"{Binding Paging}\" PageRequestCommand=\"{Binding PageRequested}\" /\u003e\n\u003cui:ValidationSummary SummaryState=\"{Binding Validation}\" /\u003e\n```\n\nMAUI binding shape:\n\n```xml\n\u003cui:SearchBox SearchState=\"{Binding Search}\" /\u003e\n\u003cui:DataFilterPanel FilterPanelState=\"{Binding Filters}\" /\u003e\n\u003cui:DataPager PaginationState=\"{Binding Paging}\" PageRequestCommand=\"{Binding PageRequested}\" /\u003e\n\u003cui:ValidationSummary SummaryState=\"{Binding Validation}\" /\u003e\n```\n\n## CrissCross.WPF.Plot\n\n`CrissCross.WPF.Plot` integrates ScottPlot with ReactiveUI and CrissCross WPF UI. It provides live chart controls, plot adapters, reactive data sources, and a right-side properties view.\n\nUse the CrissCross UI XML namespace for plot controls:\n\n```xml\nxmlns:plot=\"https://github.com/reactivemarbles/CrissCross.ui\"\n```\n\n```xml\n\u003cplot:LiveChart /\u003e\n```\n\n### Main Types\n\n| Type | Use |\n| --- | --- |\n| `LiveChart` | WPF view that hosts the live plot. |\n| `LiveChartViewModel` | Main chart view model with plot setup, commands, axes, markers, and right-side properties. |\n| `RightPropertiesView`, `RightPropertiesViewModel` | Plot property editing surface. |\n| `ReactivePlotSource` | Factory and source object for reactive plot updates. |\n| `ReactivePlotBinder` | Binds one or more `IReactivePlotSource` instances to a chart. |\n| `ReactivePlotUpdate` | Describes an append, snapshot, clear, or replace update. |\n| `ReactivePlotBindingOptions` | Controls schedulers, batching, visible point limits, overflow, and error mode. |\n| `PlotSeriesKey` | Identifies a plotted series. |\n| `IReactivePlotAdapter`, `IReactivePlotAdapterFactory` | Adapter abstraction over concrete plot controls. |\n| `IReactivePlotConnection` | Disposable binding connection. |\n| `IReactivePlotBinder`, `IReactivePlotSource` | Binding and source contracts. |\n| `AxisLinesUI`, `Crosshair_UI`, `DataLoggerUI`, `ScatterUI`, `SignalUI`, `SignalXY_UI`, `StreamerUI` | Plot UI models for supported plot item kinds. |\n| `IAppearance`, `IPlottableUI` | Plot appearance and plottable contracts. |\n\n### Plot Enums\n\n| Enum | Use |\n| --- | --- |\n| `PlotType` | Identifies plot type. |\n| `UserPlotType` | Identifies user-selectable plot type. |\n| `LegendPosition` | Places the plot legend. |\n| `PlotXAxisKind` | Selects point or timestamp X axis behavior. |\n| `ReactivePlotUpdateKind` | Describes update kind. |\n| `ReactivePlotOverflowStrategy` | Controls behavior when max visible points are exceeded. |\n| `ReactivePlotErrorMode` | Controls binding error handling. |\n| `ReactivePlotConnectionState` | Reports binding connection state. |\n\n### LiveChartViewModel Features\n\n`LiveChartViewModel` supports:\n\n| Feature | Members |\n| --- | --- |\n| WPF plot creation | `CreateWpfPlot(...)` and plot setup helpers. |\n| Axis configuration | `CreateAxisWithTimeStamp(...)`, `CreateAxisWithPoints(...)`, `AxisStyle(...)`, `YAxesSetup(...)`, `HideAllYAxis()`. |\n| Scaling | `ManualScaleY(...)` plus autoscale command helpers. |\n| Crosshairs and labels | `AddCrosshairBtn`, `ClearLabels()`, `ClearAxisCrosshairs()`, `ClearAxisLines()`. |\n| Marker and lock commands | `EnableMarkerBtn`, `GraphLocked`. |\n| Menus and properties | `ExpandMenuBtn`, `LinePropCommand`, right properties view model. |\n| Cleanup | `ClearContent()`. |\n\n### Reactive Plot Binding\n\nCreate a signal source and bind it to a chart:\n\n```csharp\nusing CrissCross.WPF.Plot;\nusing System.Reactive.Linq;\n\nvar ticks = Observable.Interval(TimeSpan.FromMilliseconds(100))\n    .Select(i =\u003e (\n        Name: \"temperature\",\n        Value: (IList\u003cdouble\u003e)new[] { Math.Sin(i / 10d) },\n        DateTime: (IList\u003cdouble\u003e)new[] { (double)i },\n        Axis: 0));\n\nvar source = ReactivePlotSource.FromSignalTicks(ticks);\n\nvar options = new ReactivePlotBindingOptions\n{\n    BatchWindow = TimeSpan.FromMilliseconds(50),\n    MaxBatchSize = 250,\n    MaxVisiblePoints = 10_000,\n    OverflowStrategy = ReactivePlotOverflowStrategy.DropOldest,\n    ErrorMode = ReactivePlotErrorMode.SurfaceAndStopSeries\n};\n\nIReactivePlotConnection connection = new ReactivePlotBinder()\n    .Bind(liveChartViewModel, new[] { source }, options);\n```\n\nFactory methods available on `ReactivePlotSource`:\n\n| Factory | Use |\n| --- | --- |\n| `FromUpdates(...)` | Bind a custom observable of `ReactivePlotUpdate`. |\n| `FromSignalTicks(...)` | Append signal values by tick. |\n| `FromScatterPoints(...)` | Append X/Y scatter points. |\n| `FromDataLoggerPoints(...)` | Append data logger points. |\n| `FromStreamerPoints(...)` | Append streaming values. |\n| `FromSignalXyPoints(...)` | Append SignalXY points. |\n| `FromSignalXySnapshot(...)` | Replace SignalXY points with snapshot data. |\n\n## CrissCross.WPF.WebView2\n\n`CrissCross.WPF.WebView2` provides a WPF `ContentControl` wrapper around Microsoft WebView2 plus an overlay host that can attach WPF windows above the browser HWND.\n\nUse the CrissCross WPF XML namespace for WebView2 controls:\n\n```xml\nxmlns:web=\"https://github.com/reactivemarbles/CrissCross\"\n```\n\n### WebView2Wpf\n\n```xml\n\u003cweb:WebView2Wpf\n    x:Name=\"Browser\"\n    Source=\"https://example.com\"\n    ZoomFactor=\"1.0\"\n    AutoDispose=\"True\"\n    AllowExternalDrop=\"False\" /\u003e\n```\n\nKey members:\n\n| Member | Use |\n| --- | --- |\n| `Source` | Current browser URI. |\n| `ZoomFactor` | Browser zoom. |\n| `CreationProperties` | WebView2 creation settings. |\n| `DefaultBackgroundColor` | Browser background color. |\n| `DesignModeForegroundColor` | Design-time foreground color. |\n| `AllowExternalDrop` | Enables external drag/drop into the browser. |\n| `AutoDispose` | Disposes WebView2 when the control is disposed. |\n| `CanGoBack`, `CanGoForward` | Browser history state. |\n| `CoreWebView2` | Underlying WebView2 instance. |\n| `Content` | WPF overlay content. |\n| `EnsureCoreWebView2Async()` | Initializes WebView2. |\n| `ExecuteScriptAsync(string)` | Runs JavaScript. |\n| `NavigateToString(string)` | Loads HTML. |\n| `GoBack()`, `GoForward()`, `Reload()`, `Stop()` | Browser commands. |\n| `Dispose()` | Releases browser resources. |\n\nEvents:\n\n```text\nContentLoading\nCoreWebView2InitializationCompleted\nNavigationStarting\nNavigationCompleted\nSourceChanged\nWebMessageReceived\nZoomFactorChanged\n```\n\n### WindowHost\n\n`WindowHost\u003cTWindow\u003e` hosts a transparent WPF `Window` as a child HWND. It is used internally by overlay scenarios and can be used directly when a WebView-hosted surface needs WPF controls above web content.\n\n```csharp\nusing CrissCross.WPF;\n\nvar host = new WindowHost\u003cOverlayWindow\u003e(\"Overlay\");\nHostContainer.Children.Add(host);\n\n// Later\nhost.Close();\n```\n\n## Theming\n\nCrissCross themes are intentionally shared in concept across WPF, Avalonia, and MAUI, but each platform applies resources through its native mechanism.\n\n### WPF Theme Flow\n\n1. Merge `ControlsDictionary`.\n2. Merge `ThemesDictionary`.\n3. Use `IThemeService` or `ApplicationThemeManager` to apply runtime theme changes.\n4. Bind `ThemeSwitcher` to `ThemePreferenceState` when the user can select theme preference.\n\n```xml\n\u003cui:ThemeSwitcher CurrentState=\"{Binding ThemePreference}\" /\u003e\n```\n\n### Avalonia Theme Flow\n\n1. Add Avalonia `FluentTheme`.\n2. Add `avares://CrissCross.Avalonia.UI/Themes/Index.axaml`.\n3. Use `IThemeService`, `ApplicationThemeManager`, or `ThemeSwitcher` for runtime changes.\n\n```xml\n\u003cui:ThemeSwitcher CurrentState=\"{Binding ThemePreference}\" /\u003e\n```\n\n### MAUI Theme Flow\n\n1. Call `Resources.UseCrissCrossMauiUiResources()`, or merge `CrissCrossMauiUi`.\n2. Bind `ThemeSwitcher` to `ThemePreferenceState`.\n3. Apply theme choice through the app-level MAUI theme service or command in your view model.\n\n```xml\n\u003cui:ThemeSwitcher ThemeState=\"{Binding ThemePreference}\" ChangeThemeCommand=\"{Binding ChangeThemeCommand}\" /\u003e\n```\n\n## Gallery Projects\n\nThe gallery applications demonstrate the controls and shared feature patterns:\n\n| Project | Demonstrates |\n| --- | --- |\n| `CrissCross.WPF.UI.Gallery` | WPF UI controls, themes, navigation, feature controls, view-model navigation, and examples. |\n| `CrissCross.Avalonia.UI.Gallery` | Avalonia UI controls, themes, feature controls, and parity examples. |\n| `CrissCross.Maui.UI.Gallery` | MAUI feature controls and shared state-model examples. |\n\nUse galleries as executable examples. The README remains the authoritative API and usage documentation.\n\n## Recommended App Structure\n\nUse shared view models and state models in a platform-neutral project:\n\n```text\nsrc/\n  Example.Core/\n    ViewModels/\n      ShellViewModel.cs\n      OrdersViewModel.cs\n    Navigation/\n      NavigationRegistration.cs\n  Example.Wpf/\n    Views/\n      ShellWindow.xaml\n      OrdersPage.xaml\n  Example.Avalonia/\n    Views/\n      ShellWindow.axaml\n      OrdersPage.axaml\n  Example.Maui/\n    Views/\n      OrdersPage.xaml\n```\n\nRegister the same view models with the platform-specific view locator, then bind platform controls to the shared state properties.\n\n## Common Recipes\n\n### Navigate From A Command\n\n```csharp\npublic sealed class HomeViewModel : RxObject, IUseHostedNavigation\n{\n    public ReactiveCommand\u003cUnit, Unit\u003e OpenDetails { get; }\n\n    public HomeViewModel()\n    {\n        OpenDetails = ReactiveCommand.Create(() =\u003e\n        {\n            this.NavigateToView\u003cDetailsViewModel\u003e();\n        });\n\n        BuildComplete();\n    }\n}\n```\n\n### Bind Search, Filters, And Paging\n\n```csharp\npublic sealed class SearchPageViewModel : RxObject\n{\n    private SearchQueryState search = new();\n    private PaginationState paging = new(pageIndex: 0, pageSize: 20, totalItemCount: 0);\n\n    public SearchQueryState Search\n    {\n        get =\u003e search;\n        private set =\u003e this.RaiseAndSetIfChanged(ref search, value);\n    }\n\n    public DataFilterPanelState FilterPanel { get; } = new();\n\n    public PaginationState Paging\n    {\n        get =\u003e paging;\n        private set =\u003e this.RaiseAndSetIfChanged(ref paging, value);\n    }\n\n    public ReactiveCommand\u003cstring, Unit\u003e SearchCommand { get; }\n    public ReactiveCommand\u003cPageRequest, Unit\u003e PageCommand { get; }\n\n    public SearchPageViewModel()\n    {\n        SearchCommand = ReactiveCommand.Create\u003cstring\u003e(query =\u003e\n        {\n            Search = new SearchQueryState(query, submittedText: query);\n        });\n\n        PageCommand = ReactiveCommand.Create\u003cPageRequest\u003e(request =\u003e\n        {\n            Paging = new PaginationState(request.PageIndex, request.PageSize, Paging.TotalItemCount);\n        });\n\n        BuildComplete();\n    }\n}\n```\n\n### Show Busy Work\n\n```csharp\npublic sealed class ImportViewModel : RxObject\n{\n    private BusyOperation? importBusy;\n\n    public BusyOperation? ImportBusy\n    {\n        get =\u003e importBusy;\n        private set =\u003e this.RaiseAndSetIfChanged(ref importBusy, value);\n    }\n\n    public ReactiveCommand\u003cUnit, Unit\u003e ImportCommand { get; }\n\n    public ImportViewModel()\n    {\n        ImportCommand = ReactiveCommand.CreateFromTask(async () =\u003e\n        {\n            ImportBusy = new BusyOperation(\"Importing records\");\n\n            try\n            {\n                await Task.Delay(1000);\n            }\n            finally\n            {\n                ImportBusy = null;\n            }\n        });\n\n        BuildComplete();\n    }\n}\n```\n\n### Validate A Form\n\n```csharp\nvar summary = new ValidationSummaryState(new[]\n{\n    new ValidationMessage(\n        fieldKey: \"email\",\n        fieldDisplayName: \"Email\",\n        message: \"Email address is required.\",\n        severity: ValidationSeverity.Error)\n});\n```\n\n### Use PropertyGridLite\n\n```csharp\nvar descriptors = new[]\n{\n    new PropertyDescriptorModel(\n        key: \"host\",\n        displayName: \"Host\",\n        category: \"Connection\",\n        editorKind: PropertyEditorKind.Text,\n        value: \"localhost\",\n        originalValue: \"localhost\"),\n    new PropertyDescriptorModel(\n        key: \"port\",\n        displayName: \"Port\",\n        category: \"Connection\",\n        editorKind: PropertyEditorKind.Number,\n        value: 5432,\n        originalValue: 5432)\n};\n\nvar state = new PropertyGridState(descriptors);\n```\n\nWPF/Avalonia:\n\n```xml\n\u003cui:PropertyGridLite InspectorState=\"{Binding Inspector}\" /\u003e\n```\n\nMAUI:\n\n```xml\n\u003cui:PropertyGridLite PropertyGridState=\"{Binding Inspector}\" /\u003e\n```\n\n## Troubleshooting\n\n| Symptom | Fix |\n| --- | --- |\n| WPF controls render partly dark and partly light | Ensure both `ControlsDictionary` and the selected `ThemesDictionary` are merged once at app startup. Avoid mixing external theme dictionaries after CrissCross resources unless intentional. |\n| WPF resource cannot find a CrissCross style | Confirm `xmlns:ui=\"https://github.com/reactivemarbles/CrissCross.ui\"` and `ControlsDictionary` are loaded before views are created. |\n| Avalonia control templates are missing | Confirm `StyleInclude Source=\"avares://CrissCross.Avalonia.UI/Themes/Index.axaml\"` is present after the base Avalonia theme. |\n| MAUI static resource is missing | Call `Resources.UseCrissCrossMauiUiResources()` or merge `\u003cstyles:CrissCrossMauiUi /\u003e` in application resources. |\n| Reactive command reports wrong parameter type | Bind commands with the parameter type the `ReactiveCommand\u003cTInput,TOutput\u003e` expects. Use `ReactiveCommand\u003cUnit, Unit\u003e` for parameterless buttons, or pass a strongly typed command parameter. |\n| WebView2 fails at startup | Install the Microsoft Edge WebView2 runtime and initialize the control with `EnsureCoreWebView2Async()` before script calls. |\n| Navigation resolves no view | Register the view with the ReactiveUI view locator or the `NavigationRegistry`, and ensure the view implements the expected `IViewFor\u003cTViewModel\u003e` contract where required. |\n\n## API Surface Checklist\n\nUse this checklist when adding or verifying package parity:\n\n| Package | Required feature families |\n| --- | --- |\n| `CrissCross` | `RxObject`, lifecycle interfaces, routed host interfaces, navigation registry, shared state models. |\n| `CrissCross.WPF` | `NavigationWindow`, `NavigationWindow\u003cTViewModel\u003e`, `ViewModelRoutedViewHost`, `NavigationWebView`, `Make.SingleInstance`, `WindowHost\u003cTWindow\u003e`. |\n| `CrissCross.Avalonia` | `NavigationWindow`, `NavigationWindow\u003cTViewModel\u003e`, `NavigationUserControl`, `NavigationUserControl\u003cTViewModel\u003e`, `ViewModelRoutedViewHost`, `ReactiveTransitioningContentControl`. |\n| `CrissCross.MAUI` | `NavigationShell`. |\n| `CrissCross.WinForms` | `NavigationForm`, `NavigationForm\u003cTViewModel\u003e`, `ViewModelRoutedViewHost`. |\n| `CrissCross.WPF.UI` | WPF controls, themes, services, theme managers, app shell, feature controls, icons, and resource dictionaries. |\n| `CrissCross.Avalonia.UI` | Avalonia controls, themes, services, theme managers, settings store, app shell, feature controls, and resources. |\n| `CrissCross.Maui.UI` | MAUI feature controls, theme resources, and state-model bindings. |\n| `CrissCross.WPF.Plot` | Live chart, reactive plot binding, adapters, sources, plot UI models, and right properties view. |\n| `CrissCross.WPF.WebView2` | `WebView2Wpf`, `WindowHost\u003cTWindow\u003e`, WebView2 events, browser commands, and overlay content. |\n\n\n---\n\n## Contributing\n\nIssues and PRs are welcome. Please include platform, .NET version, and a minimal repro where applicable.\n\n---\n\n## License\n\nMIT © ReactiveUI Association Incorporated\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactivemarbles%2Fcrisscross","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freactivemarbles%2Fcrisscross","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactivemarbles%2Fcrisscross/lists"}