CrissCross.MAUI 1.0.3

There is a newer version of this package available.
See the version list below for details.
dotnet add package CrissCross.MAUI --version 1.0.3                
NuGet\Install-Package CrissCross.MAUI -Version 1.0.3                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CrissCross.MAUI" Version="1.0.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add CrissCross.MAUI --version 1.0.3                
#r "nuget: CrissCross.MAUI, 1.0.3"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install CrissCross.MAUI as a Cake Addin
#addin nuget:?package=CrissCross.MAUI&version=1.0.3

// Install CrissCross.MAUI as a Cake Tool
#tool nuget:?package=CrissCross.MAUI&version=1.0.3                

CrissCross

A Navigation Framework for ReactiveUI based projects

CrissCross

What is CrissCross?

CrissCross is a navigation framework for ReactiveUI based projects. It is designed to be used with ReactiveUI, but could be adapted to be used with any MVVM framework.

Why CrissCross?

CrissCross is designed to be a simple, lightweight, and easy to use navigation framework. It is designed to be used with ReactiveUI.

How do I use CrissCross?

Step 1: Install CrissCross

CrissCross is available on NuGet. You can install it using the NuGet Package Manager:

Install-Package CrissCross.WPF

or

Install-Package CrissCross.XamForms

or

Install-Package CrissCross.MAUI

or

Install-Package CrissCross.Avalonia

or

Install-Package CrissCross.WinForms

Step 2: Create a ViewModel

Create a ViewModel that inherits from RxObject. This is the ViewModel that will be used for the MainWindow.

    public class MainWindowViewModel : RxObject
    {
        public MainWindowViewModel()
        {
            this.BuildComplete(() =>
            {
                // Do something when the IOC Container is built
            });

            // Setup the IOC Container
            Locator.CurrentMutable.RegisterConstant<MainViewModel>(new());
            Locator.CurrentMutable.Register<IViewFor<MainViewModel>>(() => new MainView());

            Locator.CurrentMutable.RegisterConstant<FirstViewModel>(new());
            Locator.CurrentMutable.Register<IViewFor<FirstViewModel>>(() => new FirstView());
            
            // Notify the application that the IOC Container that it is complete and ready to use.
            Locator.CurrentMutable.SetupComplete();
        }
    }

Step 3: Create a View

Create a View that inherits from NavigationWindow. This is the View that will be used for the MainWindow. add xmlns:rxNav="https://github.com/ChrisPulman/CrissCross" to the Window inherits in XAML. Change Window to rxNav:NavigationWindow in XAML. Add x:TypeArguments="local:MainWindowViewModel"

    public partial class MainWindow : NavigationWindow<MainWindowViewModel>
    {
        public MainWindow()
        {
            // Remember to set x:Name in XAML to "mainWindow"
            InitializeComponent();
            
            this.WhenActivated(disposables =>
            {
                // Do something when the View is activated

                // Configure the Navigation for the MainWindow
                NavBack.Command = ReactiveCommand.Create(() => this.NavigateBack(), CanNavigateBack).DisposeWith(d);
                
                // Navigate to the MainViewModel
                this.NavigateToView<MainViewModel>();
            });
        }
    }

Step 4: Create a ViewModel

Create a ViewModel that inherits from RxObject. This is the ViewModel that will be used for the MainView.

    public class MainViewModel : RxObject
    {
        public MainViewModel()
        {
            this.BuildComplete(() =>
            {
                // Do something when the IOC Container is built

                // Configure the Navigation for the MainViewModel using, you will pass the name of the Navigation Host Window that you want to navigate with.
                this.NavigateBack("mainWindow")
                this.CanNavigateBack("mainWindow")
                this.NavigateToView<FirstViewModel>("mainWindow")
            });
        }
    }

Step 5: Create a View

Create a View that inherits from ReactiveUserControl. This is the View that will be used for the MainView.

    public partial class MainView : ReactiveUserControl<MainViewModel>
    {
        public MainView()
        {
            InitializeComponent();

            this.WhenActivated(disposables =>
            {
                // Do something when the View is activated
            });
        }
    }

Step 6: For WPF Applications Configure Single Instance Application if required

If you want to prevent multiple instances of the application from running at the same time, you can use the Make.SingleInstance method.

    protected override void OnStartup(StartupEventArgs e)
    {
        // This will prevent multiple instances of the application from running at the same time.
        Make.SingleInstance("MyUniqueAppName ddd81fc8-9107-4e33-b848-cac4c3ec3d2a");
        base.OnStartup(e);
    }

Step 7: Run the application

Run the application and you should see the MainView.

Avalonia

Step 1: Install CrissCross

CrissCross is available on NuGet. You can install it using the NuGet Package Manager:

Install-Package CrissCross.Avalonia

Step 2: Create a ViewModel

Create a ViewModel that inherits from RxObject. This is the ViewModel that will be used for the MainWindow.

    public class MainWindowViewModel : RxObject
    {
        public MainWindowViewModel()
        {
            this.BuildComplete(() =>
            {
                // Do something when the IOC Container is built
            });

            // Setup the IOC Container
            Locator.CurrentMutable.RegisterConstant<MainViewModel>(new());
            Locator.CurrentMutable.Register<IViewFor<MainViewModel>>(() => new MainView());

            Locator.CurrentMutable.RegisterConstant<FirstViewModel>(new());
            Locator.CurrentMutable.Register<IViewFor<FirstViewModel>>(() => new FirstView());
            
            // Notify the application that the IOC Container that it is complete and ready to use.
            Locator.CurrentMutable.SetupComplete();
        }
    }

Step 3: Create a NavigationView

Create a View that inherits from NavigationWindow OR NavigationUserControl. This is the View that will be used for the MainWindow. add xmlns:rxNav="https://github.com/ChrisPulman/CrissCross" Change Window to rxNav:NavigationWindow in XAML. OR Change UserControl to rxNav:NavigationUserControl in XAML.

As Avalonia has two modes of operation you will need to select the correct mode for your application.

    public partial class MainWindow : NavigationWindow<MainWindowViewModel>
    {
        public MainWindow()
        {
            // Remember to set x:Name in XAML to "mainWindow"
            InitializeComponent();
            
            this.WhenActivated(disposables =>
            {
                // Do something when the View is activated

                // Configure the Navigation for the MainWindow
                NavBack.Command = ReactiveCommand.Create(() => this.NavigateBack(), CanNavigateBack).DisposeWith(d);
                
                // Navigate to the MainViewModel
                this.NavigateToView<MainViewModel>();
            });
        }
    }

Step 4: Create a ViewModel

Create a ViewModel that inherits from RxObject. This is the ViewModel that will be used for the MainView.

    public class MainViewModel : RxObject
    {
        public MainViewModel()
        {
            this.BuildComplete(() =>
            {
                // Do something when the IOC Container is built

                // Configure the Navigation for the MainViewModel using, you will pass the name of the Navigation Host Window that you want to navigate with.
                this.NavigateBack("mainWindow")
                this.CanNavigateBack("mainWindow")
                this.NavigateToView<FirstViewModel>("mainWindow")
            });
        }
    }

Step 5: Create a View

Create a View that inherits from ReactiveUserControl. This is the View that will be used for the MainView.

    public partial class MainView : ReactiveUserControl<MainViewModel>
    {
        public MainView()
        {
            InitializeComponent();

            this.WhenActivated(disposables =>
            {
                // Do something when the View is activated
            });
        }
    }
Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net6.0-windows10.0.19041 is compatible.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net7.0-windows10.0.19041 is compatible.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.2.1 75 11/25/2024
2.2.0 73 11/18/2024
2.1.3 87 11/7/2024
2.1.2 85 11/5/2024
2.1.1 82 11/5/2024
2.1.0 94 10/13/2024
2.0.6 66 8/2/2024
2.0.5 75 8/1/2024
2.0.4 61 7/31/2024
2.0.3 75 7/28/2024
2.0.2 70 7/25/2024
2.0.1 93 7/10/2024
2.0.0 109 5/18/2024
1.0.25 116 4/30/2024
1.0.24 117 4/19/2024
1.0.23 106 4/10/2024
1.0.22 99 3/29/2024
1.0.21 100 3/26/2024
1.0.20 108 3/22/2024
1.0.19 105 3/21/2024
1.0.18 110 3/19/2024
1.0.17 101 3/14/2024
1.0.16 110 3/13/2024
1.0.15 102 3/12/2024
1.0.14 106 3/11/2024
1.0.13 110 3/8/2024
1.0.12 115 3/7/2024
1.0.11 114 3/5/2024
1.0.10 116 2/22/2024
1.0.9 127 2/21/2024
1.0.8 116 2/21/2024
1.0.7 92 2/19/2024
1.0.6 107 2/16/2024
1.0.5 116 2/8/2024
1.0.4 175 1/4/2024
1.0.3 149 9/11/2023
1.0.2 143 9/9/2023
1.0.1 140 9/8/2023
1.0.0 136 9/7/2023
0.9.2 138 9/6/2023
0.9.1 171 8/6/2023
0.9.0 158 7/12/2023

Compatability with Net 6, Net 7 and netstandard2.0