Skip to content

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.

  • GitHub stars for shinyorg/scheduler
  • NuGet package Shiny.Maui.Scheduler
Frameworks
.NET MAUI
CalendarAgendaEvent List
Calendar ViewAgenda ViewEvent List View
  • Three views — Monthly calendar grid, day/multi-day agenda timeline, and vertically scrolling event list
  • Shared data interface — All views consume ISchedulerEventProvider so 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 constraintsMinDate/MaxDate on 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
  1. Install the NuGet package

    Terminal window
    dotnet add package Shiny.Maui.Scheduler
  2. Configure in MauiProgram.cs

    var builder = MauiApp.CreateBuilder();
    builder
    .UseMauiApp<App>()
    .UseShinyScheduler();
  3. Implement ISchedulerEventProvider

    public 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;
    }
  4. Add a view to your page

    <ContentPage xmlns:scheduler="clr-namespace:Shiny.Maui.Scheduler;assembly=Shiny.Maui.Scheduler">
    <scheduler:SchedulerCalendarView
    Provider="{Binding Provider}"
    SelectedDate="{Binding SelectedDate}" />
    </ContentPage>
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; }
}
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.

An AI skill is available for Shiny MAUI Scheduler to help generate views, event providers, and templates directly in your IDE.

Claude Code

Terminal window
claude plugin add github:shinyorg/skills

GitHub Copilot — Copy the shiny-maui-scheduler skill file into your repository’s custom instructions.