Scheduler | Getting Started
A .NET MAUI scheduling and calendar component library providing three views: a monthly calendar, an agenda timeline, and a vertically scrolling event list. All views are AOT-safe, fully programmatic (no XAML internals), and share a single ISchedulerEventProvider interface for data.
Screenshots
Section titled “Screenshots”| Calendar | Agenda | Event List |
|---|---|---|
![]() | ![]() | ![]() |
Features
Section titled “Features”- Three views — Monthly calendar grid, day/multi-day agenda timeline, and vertically scrolling event list
- Shared data interface — All views consume
ISchedulerEventProviderso you write your data layer once - AOT-safe — All bindings use static lambda overloads, no string-based reflection
- Custom templates — Every visual element (events, headers, loaders, day pickers) is replaceable via
DataTemplate - Multi-day events — Events spanning multiple days are handled automatically across all views
- Gesture support — Swipe/pan navigation and pinch-to-zoom on all views
- Date constraints —
MinDate/MaxDateon all views to limit navigation and selection - Multiple timezones — Agenda view supports additional timezone columns with sticky headers
- Infinite scroll — Event list loads more data as you scroll in both directions
- Current time marker — Agenda displays a live time indicator that updates every minute
-
Install the NuGet package
Terminal window dotnet add package Shiny.Maui.Scheduler -
Configure in
MauiProgram.csvar builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().UseShinyScheduler(); -
Implement
ISchedulerEventProviderpublic class MyEventProvider : ISchedulerEventProvider{public async Task<IReadOnlyList<SchedulerEvent>> GetEvents(DateTimeOffset start, DateTimeOffset end){return await myService.GetEventsAsync(start, end);}public void OnEventSelected(SchedulerEvent selectedEvent){// Handle event tap — navigate to detail, show dialog, etc.}public bool CanCalendarSelect(DateOnly selectedDate) => true;public void OnCalendarDateSelected(DateOnly selectedDate) { }public void OnAgendaTimeSelected(DateTimeOffset selectedTime) { }public bool CanSelectAgendaTime(DateTimeOffset selectedTime) => true;} -
Add a view to your page
<ContentPage xmlns:scheduler="clr-namespace:Shiny.Maui.Scheduler;assembly=Shiny.Maui.Scheduler"><scheduler:SchedulerCalendarViewProvider="{Binding Provider}"SelectedDate="{Binding SelectedDate}" /></ContentPage>
Core Models
Section titled “Core Models”SchedulerEvent
Section titled “SchedulerEvent”public class SchedulerEvent{ public string Identifier { get; set; } // Default: new Guid public string Title { get; set; } public string? Description { get; set; } public Color? Color { get; set; } public bool IsAllDay { get; set; } public DateTimeOffset Start { get; set; } public DateTimeOffset End { get; set; }}ISchedulerEventProvider
Section titled “ISchedulerEventProvider”public interface ISchedulerEventProvider{ Task<IReadOnlyList<SchedulerEvent>> GetEvents(DateTimeOffset start, DateTimeOffset end); void OnEventSelected(SchedulerEvent selectedEvent); bool CanCalendarSelect(DateOnly selectedDate); void OnCalendarDateSelected(DateOnly selectedDate); void OnAgendaTimeSelected(DateTimeOffset selectedTime); bool CanSelectAgendaTime(DateTimeOffset selectedTime);}The provider is not resolved from DI — you pass any implementation directly to the view via the Provider bindable property (from XAML binding or code-behind). This means you can use different providers for different views, or swap providers at runtime.
AI Coding Assistant
Section titled “AI Coding Assistant”An AI skill is available for Shiny MAUI Scheduler to help generate views, event providers, and templates directly in your IDE.
Claude Code
claude plugin add github:shinyorg/skillsGitHub Copilot — Copy the shiny-maui-scheduler skill file into your repository’s custom instructions.
Next Steps
Section titled “Next Steps”- Calendar View — Monthly calendar grid with event indicators
- Agenda View — Day/multi-day timeline with overlap detection
- Event List — Vertically scrolling event list grouped by day
- Custom Templates — Override any visual element with custom DataTemplates
- Release Notes


