Community.Sextant.WinUI is a plugin for reactiveui/Sextant: A ReactiveUI navigation library. It adds support for Windows UI Library (WinUI) 3.
dotnet add Community.Sextant.WinUIDepending on whichDependency Injection framework you are using, you can install a different helper package:
-
reactiveui/splat: Makes things cross-platform:
dotnet add Community.Sextant.WinUI.Splat
-
Microsoft.Extensions.DependencyInjection:
dotnet add Community.Sextant.WinUI.Microsoft.Extensions.DependencyInjection
NOTE:
Sextantandreactiveuiboth always useSplatbutSplatcan useMicrosoft.Extensions.DependencyInjectionas internal dependency resolver. Please see the Advanced Integration Tutorial of Splat for more details. -
Your favorite DI: Please create a feature request for it!
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...
}
}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
}
}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.
// 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.
// 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.
You can implement INavigationViewAdapter and cover your own use cases easily.
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.
Locator.CurrentMutable
.RegisterViewWinUI(
() => new MyView(),
() => new MyViewModel()
);viewBuilder.RegisterViewAndViewModel<
MyView,
MyViewModel
>();viewBuilder is available in the ConfigureViews call.