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.WinUI
Depending 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:
Sextant
andreactiveui
both always useSplat
butSplat
can useMicrosoft.Extensions.DependencyInjection
as 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 View
s 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.