Skip to content

A ReactiveUI navigation library for WinUI 3

License

Notifications You must be signed in to change notification settings

Gitii/Community.Sextant.WinUI

Repository files navigation

Community.Sextant.WinUI

Community.Sextant.WinUI is a plugin for reactiveui/Sextant: A ReactiveUI navigation library. It adds support for Windows UI Library (WinUI) 3.

Getting Started

Installation

dotnet add Community.Sextant.WinUI

Depending on whichDependency Injection framework you are using, you can install a different helper package:

Configuration

Using Splat

In your App.xaml.cs:

public partial class App : Application
{
    public App()
    {
        this.InitializeComponent();

        Init();
    }

    /// Add this method and call in the constructor after this.InitializeComponent();
    void Init()
    {
        // Recommended
        RxApp.DefaultExceptionHandler = new SextantDefaultExceptionHandler();
        Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly());
        
        // Required
        Locator.CurrentMutable
            .RegisterWinUIViewLocator()
            .RegisterParameterViewStackService()
            .RegisterViewStackServiceFromParameterService()
            .RegisterNavigationView()
            .RegisterConstantAnd<IDialogManager>(new DialogManager());
        // Will be expanded later...
    }
}

Using Microsoft DI:

public partial class App : Application
{
    public App()
    {
        this.InitializeComponent();

        Init();
    }

    // Add this code block

    public IServiceProvider? Container { get; private set; }

    /// Call this method in the constructor after this.InitializeComponent();
    void Init()
    {
        RxApp.DefaultExceptionHandler = new SextantDefaultExceptionHandler();
        var host = Host.CreateDefaultBuilder()
            .ConfigureServices(
                services =>
                {
                    services.UseMicrosoftDependencyResolver();
                    var resolver = Locator.CurrentMutable;
                    resolver.InitializeSplat();
                    resolver.InitializeReactiveUI();

                    // Configure our local services and access the host configuration
                    ConfigureServices(services);

                    // Configure Sextant, Views and ViewModels
                    services.UseSextant(
                        builder =>
                        {
                            builder.ConfigureDefaults();
                            builder.ConfigureViews(
                                viewBuilder =>
                                {
                                    // Will be expanded later...
                                }
                            );
                        }
                    );
                }
            )
            .UseEnvironment(Environments.Development)
            .Build();

        // Since MS DI container is a different type,
        // we need to re-register the built container with Splat again
        Container = host.Services;
        Container.UseMicrosoftDependencyResolver();
    }

    void ConfigureServices(IServiceCollection services)
    {
        // register your other services here
    }
}

Connect with your UI

Community.Sextant.WinUI needs to know where to push pages and models to. Typically a Frame Class is used for that. In combination with a NavigationView Class you can create a simple application with dynamic routing.

Frame Frame and NavigationView Advanced
A simple Frame only A Frame and NavigationView Integrate any control!

A simple Frame

// Tell navigation service which <Frame /> to use
// A reference to the containing <Window /> is also needed for Popups.
_navigationService.SetAdapter(new FrameNavigationViewAdapter(MyFrame, MyWindow));

See SextantSample.WinUI.FrameOnly for a simple example.

A Frame and NavigationView

// Tell navigation service which <Frame /> && <NavigationView /> to use
// A reference to the containing <Window /> is also needed for Popups.
_navigationService.SetAdapter(
    new NavigationViewAdapter(MyFrame, MyWindow, MyNavigationView)
);

See SextantSample.WinUI.FrameWithNavigationView for an example.

Integrate any control

You can implement INavigationViewAdapter and cover your own use cases easily.

Add your view models

You need to register your Views and ViewModels other Sextant cannot find and create them. This is a separate step from the usual service registration.

Using Splat

Locator.CurrentMutable
    .RegisterViewWinUI(
        () => new MyView(),
        () => new MyViewModel()
    );

Using Microsoft DI:

viewBuilder.RegisterViewAndViewModel<
    MyView,
    MyViewModel
>();

viewBuilder is available in the ConfigureViews call.