https://github.com/nevermorewd/asyncnavigation
A lightweight asynchronous navigation framework based on Microsoft.Extensions.DependencyInjection
https://github.com/nevermorewd/asyncnavigation
async avalonia dependency-injection ioc mvvm navigation prism showdialog wpf
Last synced: 3 months ago
JSON representation
A lightweight asynchronous navigation framework based on Microsoft.Extensions.DependencyInjection
- Host: GitHub
- URL: https://github.com/nevermorewd/asyncnavigation
- Owner: NeverMorewd
- License: mit
- Created: 2025-07-26T13:05:05.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2026-03-20T12:35:19.000Z (3 months ago)
- Last Synced: 2026-03-21T02:20:02.823Z (3 months ago)
- Topics: async, avalonia, dependency-injection, ioc, mvvm, navigation, prism, showdialog, wpf
- Language: C#
- Homepage:
- Size: 21 MB
- Stars: 26
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
# AsyncNavigation
> A lightweight async navigation framework for .NET desktop apps, built on `Microsoft.Extensions.DependencyInjection`.
[](https://github.com/NeverMorewd/AsyncNavigation/actions/workflows/ci.yml)
[](https://www.nuget.org/packages/AsyncNavigation)
[](https://www.nuget.org/packages/AsyncNavigation.Avalonia)
[](https://www.nuget.org/packages/AsyncNavigation.Wpf)
[](LICENSE)
[](https://dotnet.microsoft.com)
**[中文文档](readme_zh-cn.md)** · **[Live Demo](https://nevermorewd.github.io/AsyncNavigation/)**
---
## Features
| | |
|---|---|
| **Async/Await Native** | Navigation is fully async end-to-end with `CancellationToken` support |
| **DI-First** | Views and view models are resolved from the DI container |
| **Navigation Guard** | Block navigation away with `INavigationGuard` (e.g. unsaved changes) |
| **Interceptors** | Run cross-cutting logic (auth, analytics) via `INavigationInterceptor` |
| **Dialog Service** | Async dialog and window management built-in |
| **Multiple Region Types** | `ContentControl`, `ItemsControl`, and `TabControl` regions |
| **History Navigation** | `GoForwardAsync` / `GoBackAsync` out of the box |
| **Lifecycle Management** | Automatic view caching, eviction, and disposal — no memory leaks |
| **Native AOT** | Full Avalonia AOT / trimming support, zero extra config |
| **Framework-Agnostic** | Works with any MVVM framework |
| **Minimal Deps** | Only `Microsoft.Extensions.DependencyInjection.Abstractions >= 8.0` |
---
## Installation
```bash
# Avalonia
dotnet add package AsyncNavigation.Avalonia
# WPF
dotnet add package AsyncNavigation.Wpf
```
---
## Quick Start
### 1. Register services
```csharp
services.AddNavigationSupport()
.RegisterView("Home")
.RegisterView("Settings")
.RegisterDialog("Confirm");
```
### 2. Declare a region in XAML
```xml
xmlns:an="https://github.com/NeverMorewd/AsyncNavigation"
```
### 3. Navigate
```csharp
// Navigate
await _regionManager.RequestNavigateAsync("MainRegion", "Home");
// History
await _regionManager.GoBackAsync("MainRegion");
await _regionManager.GoForwardAsync("MainRegion");
// Dialog
var result = await _dialogService.ShowViewDialogAsync("Confirm");
```
### 4. React to navigation in view models
```csharp
// Derive from NavigationAwareBase and override only what you need.
public class HomeViewModel : NavigationAwareBase
{
public override async Task OnNavigatedToAsync(NavigationContext context)
{
await LoadDataAsync(context.CancellationToken);
}
}
```
---
## Navigation Guard
```csharp
public class EditViewModel : NavigationAwareBase, INavigationGuard
{
public async Task CanNavigateAsync(NavigationContext context, CancellationToken ct)
{
// Return false to cancel — show a confirmation dialog here if needed.
return !HasUnsavedChanges;
}
}
```
## Interceptors
```csharp
public class AuthInterceptor : INavigationInterceptor
{
public Task OnNavigatingAsync(NavigationContext context)
{
if (!_auth.IsLoggedIn)
throw new OperationCanceledException("Not authenticated.");
return Task.CompletedTask;
}
public Task OnNavigatedAsync(NavigationContext context) => Task.CompletedTask;
}
// Register
services.AddNavigationSupport()
.RegisterNavigationInterceptor();
```
---
## License
MIT