![]() |
VOOZH | about |
dotnet add package CrissCross.XamForms --version 3.0.2
NuGet\Install-Package CrissCross.XamForms -Version 3.0.2
<PackageReference Include="CrissCross.XamForms" Version="3.0.2" />
<PackageVersion Include="CrissCross.XamForms" Version="3.0.2" />Directory.Packages.props
<PackageReference Include="CrissCross.XamForms" />Project file
paket add CrissCross.XamForms --version 3.0.2
#r "nuget: CrissCross.XamForms, 3.0.2"
#:package CrissCross.XamForms@3.0.2
#addin nuget:?package=CrissCross.XamForms&version=3.0.2Install as a Cake Addin
#tool nuget:?package=CrissCross.XamForms&version=3.0.2Install as a Cake Tool
A navigation framework and set of UI components for ReactiveUI-based applications across WPF, Avalonia, MAUI, and WinForms.
CrissCross provides ViewModel-first navigation, hostable navigation surfaces, and a comprehensive WPF UI control set with a strong ReactiveUI focus. It promotes:
Supported platforms and packages:
NuGet packages:
Note: Xamarin.Forms support exists in separate projects but for new apps prefer .NET MAUI.
CrissCross builds on ReactiveUI to provide ViewModel-first navigation:
Register your ViewModels and Views with Splat๏ฟฝs Locator or Microsoft.Extensions.DependencyInjection. CrissCross uses the locator to resolve Views for navigation targets.
public class AppBootstrapper : RxObject
{
public AppBootstrapper()
{
this.BuildComplete(() =>
{
// Example VM/View registrations using Splat
AppLocator.CurrentMutable.RegisterConstant(new MainViewModel());
AppLocator.CurrentMutable.Register<IViewFor<MainViewModel>>(() => new MainView());
AppLocator.CurrentMutable.RegisterConstant(new FirstViewModel());
AppLocator.CurrentMutable.Register<IViewFor<FirstViewModel>>(() => new FirstView());
AppLocator.CurrentMutable.SetupComplete();
});
}
}
public partial class MainWindow : NavigationWindow<MainWindowViewModel>
{
public MainWindow()
{
InitializeComponent(); // Ensure x:Name is set on the Window (e.g., "mainWindow")
this.WhenActivated(d =>
{
// Bind back command, etc
NavBack.Command = ReactiveCommand.Create(() => this.NavigateBack(), CanNavigateBack).DisposeWith(d);
// Navigate to a start VM
this.NavigateToView<MainViewModel>();
});
}
}
public class MainViewModel : RxObject
{
public MainViewModel()
{
this.BuildComplete(() =>
{
// Target a specific host by name (Window x:Name)
this.NavigateToView<FirstViewModel>("mainWindow");
});
}
}
public partial class MainView : ReactiveUserControl<MainViewModel>
{
public MainView()
{
InitializeComponent();
this.WhenActivated(_ => { /* bindings, commands */ });
}
}
NavigationWindow (WPF): A Window that exposes a ViewModelRoutedViewHost and transition support
FluentNavigationWindow (WPF UI): A fluent-styled NavigationWindow with additional title content areas and Transition
NavigationUserControl (WPF UI, Avalonia): A hostable control version of the navigation container (for regions/panels)
ViewModelRoutedViewHost (WPF): Core host implementation
HostName: Set on NavigationWindow/NavigationUserControl (typically from x:Name) to route cross-host navigation
A comprehensive set of fluent controls and services designed for ReactiveUI apps. Highlights include:
Include the control resources by merging the ControlsDictionary:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ControlsDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
For page-based apps using WPF UI, use the host builder extensions:
private static readonly IHost _host = Host.CreateDefaultBuilder()
.ConfigureCrissCrossForPageNavigation<MainWindow, DashboardPage>()
.ConfigureServices((context, services) =>
{
services.AddSingleton<MainWindowViewModel>();
services.AddSingleton<DashboardPage>().AddSingleton<DashboardViewModel>();
services.AddSingleton<DataPage>().AddSingleton<DataViewModel>();
services.AddSingleton<SettingsPage>().AddSingleton<SettingsViewModel>();
services.AddSingleton<LoginPage>().AddSingleton<LoginViewModel>();
})
.Build();
Wire up and start in App.xaml.cs, then navigate using IPageService or NavigationView.
A powerful navigation control that manages a journal and hierarchical navigation stack:
The control maintains a NavigationStack and history so you can build rich shell navigation experiences.
public partial class MainUserControl : NavigationUserControl<MainWindowViewModel>
{
public MainUserControl()
{
InitializeComponent();
this.WhenActivated(d =>
{
this.NavigateToView<MainViewModel>();
_NavBack!.Command = ReactiveCommand.Create(() => this.NavigateBack(), this.CanNavigateBack()).DisposeWith(d);
});
}
}
MAUI helpers integrate with ReactiveUI.Maui. Register your VMs/Views with DI and navigate using the same NavigateToView/Back helpers where applicable. Prefer this approach over Xamarin.Forms for new apps.
Packages:
CrissCross.WPF.WebView2 provides a NavigationWebView that hosts WebView2 while allowing WPF content overlays:
xmlns:webv="https://github.com/reactivemarbles/CrissCross"
<webv:WebView2Wpf x:Name="WebView2Wpf" AutoDispose="True">
</webv:WebView2Wpf>
WebView2Wpf.Source = new Uri("https://www.reactiveui.net/");
CrissCross.WPF.Plot adds Reactive plotting components:
Install: Install-Package CrissCross.WPF.Plot
Persist and track control/window state:
_tracker?.Configure<MainWindow>()
.Id(w => w.Name, $"[Width={SystemParameters.VirtualScreenWidth},Height{SystemParameters.VirtualScreenHeight}]")
.Properties(w => new { w.Height, w.Width, w.Left, w.Top, w.WindowState })
.PersistOn(w => nameof(w.Closing))
.StopTrackingOn(w => nameof(w.Closing));
Browse these projects to see real-world usage patterns, navigation setup, and control bindings.
Prevent multiple instances using Make.SingleInstance in App:
protected override void OnStartup(StartupEventArgs e)
{
Make.SingleInstance("MyUniqueAppName ddd81fc8-9107-4e33-b848-cac4c3ec3d2a");
base.OnStartup(e);
}
Issues and PRs are welcome. Please include platform, .NET version, and a minimal repro where applicable.
MIT ๏ฟฝ ReactiveUI Association Incorporated
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 was computed. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 was computed. |
| .NET Framework | net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.0.2 | 264 | 1/12/2026 |
| 2.6.60 | 152 | 1/7/2026 |
| 2.6.57 | 144 | 1/5/2026 |
| 2.6.55 | 231 | 12/22/2025 |
| 2.6.22 | 727 | 12/2/2025 |
| 2.6.20 | 400 | 11/17/2025 |
| 2.6.17 | 346 | 11/12/2025 |
| 2.6.14 | 207 | 11/8/2025 |
| 2.6.2 | 328 | 9/15/2025 |
| 2.5.4 | 269 | 9/2/2025 |
| 2.5.3 | 269 | 9/1/2025 |
| 2.5.2 | 293 | 6/24/2025 |
| 2.5.1 | 421 | 6/12/2025 |
| 2.5.0 | 217 | 5/31/2025 |
| 2.4.1 | 303 | 4/1/2025 |
| 2.4.0 | 276 | 4/1/2025 |
| 2.3.0 | 269 | 3/28/2025 |
| 2.2.8 | 297 | 3/16/2025 |
| 2.2.7 | 330 | 3/12/2025 |
| 2.2.6 | 280 | 2/19/2025 |
Compatability with Net 8/9/10 and netstandard2.0