⚠️ Not Ready for Production - This framework is currently in active development and not yet ready for production use. APIs may change without notice.
A lightweight .NET wizard framework enabling multi-step user interactions with clean separation of concerns, proper navigation, and extensibility for UI frameworks like WPF, MAUI, and Blazor.
- Lightweight & Fast - Minimal dependencies and optimized performance
- UI Framework Agnostic - Core logic works across WPF, MAUI, Blazor, and more
- Clean Architecture - Proper separation between Model, ViewModel, and View
- Fluent API - Intuitive wizard building with method chaining
- Async-First - Built for modern async/await patterns
- Type-Safe - Strongly-typed step models with compile-time safety
- Extensible - Plugin architecture for custom validation and navigation
# Not yet available on NuGet - build from source
dotnet add package Uizado.Core
dotnet add package Uizado.Wpf # For WPF projectspublic class BasicInfoModel
{
public string FirstName { get; set; } = "";
public string LastName { get; set; } = "";
public string Email { get; set; } = "";
public int Age { get; set; }
}public class BasicInfoStep : IWizardStep<BasicInfoModel>
{
public string Title => "Basic Information";
public BasicInfoModel Model { get; private set; } = new();
public async Task OnEnterAsync(WizardContext context)
{
// Initialize step - create views, bind data
Model = context.GetModel<BasicInfoModel>() ?? new BasicInfoModel();
}
public Task<bool> ValidateAsync(WizardContext context)
{
// Validate user input
bool isValid = !string.IsNullOrEmpty(Model.FirstName) &&
!string.IsNullOrEmpty(Model.Email);
if (isValid)
context.SetModel(Model);
return Task.FromResult(isValid);
}
public async Task OnExitAsync(WizardContext context)
{
// Cleanup step resources
}
}// Create wizard with fluent API
var wizard = new WizardBuilder()
.AddStep<BasicInfoStep>()
.AddStep<SummaryStep>()
.Build();
// For WPF applications
var wizardWindow = new WizardWindow(wizard);
wizardWindow.Title = "User Onboarding";
var result = await wizardWindow.ShowWizardAsync();
if (result == true)
{
// Wizard completed successfully
var userData = wizard.Context.GetModel<BasicInfoModel>();
}📁 Uizado/
├── 📁 source/
│ ├── 📦 Uizado.Core/ # Core framework (platform-agnostic)
│ └── 📦 Uizado.Wpf/ # WPF renderer and components
├── 📁 examples/
│ └── 📦 Uizado.Wpf.SimpleOnboarding/ # Working example
└── 📁 tests/ # Unit tests (planned)
| Framework | Status | Package |
|---|---|---|
| WPF | ✅ Working | Uizado.Wpf |
| MAUI | 🚧 thinking about | Uizado.Maui |
| Blazor | 🚧 Planned | Uizado.Blazor |
Uizādo follows clean architecture principles:
IWizardStep<T>- Step interface with lifecycle methodsWizardContext- Shared state container across stepsWizardBuilder- Fluent API for wizard configurationWizard- Core orchestrator managing navigation and lifecycle- UI Renderers - Platform-specific implementations (WPF, MAUI, etc.)
OnEnterAsync()- Initialize step, create views, bind dataValidateAsync()- Validate user input before navigationOnExitAsync()- Cleanup resources, finalize step
- Models are stored in
WizardContextand persist across steps - Navigation is handled by the core
Wizardclass - UI updates are managed by platform-specific renderers
- ✅ Core framework architecture
- ✅ WPF renderer with MVVM support
- ✅ Working example application
- ✅ Basic validation and navigation
- 🚧 Unit test coverage
- 🚧 Documentation and examples
- 🚧 NuGet packaging
- 🚧 Additional UI framework support
TBD
MIT License - see LICENSE file for details
Inspired by the need for a modern, lightweight wizard framework for .NET applications that works across multiple UI platforms and the need to start learning about new topic