Skip to content
Welcome to our documentation!

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/controls
  • NuGet downloads for Shiny.Maui.Controls
  • NuGet downloads for Shiny.Blazor.Controls
Frameworks
.NET MAUI
Blazor
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
Shiny.Maui.ControlsNuGet package Shiny.Maui.Controls
  1. 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;
    }
  2. 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.

claude plugin marketplace add shinyorg/skills
claude plugin install shiny-client@shiny
BLE, GPS, Jobs, Notifications, Push, HTTP Transfers, OBD, Music — iOS, Android, Windows, MacOS, Linux, Web
claude plugin install shiny-maui@shiny
Shell, Contact Store
claude plugin install shiny-controls@shiny
TableView, BottomSheet, PillView, ImageViewer, Scheduler, Markdown, Mermaid Diagrams — MAUI and Blazor
claude plugin install shiny-mediator@shiny
Mediator/CQRS with middleware and source generators
claude plugin install shiny-data@shiny
DocumentDB and Spatial data libraries
claude plugin install shiny-aspire@shiny
Orleans and Gluetun Aspire integrations
claude plugin install shiny-extensions@shiny
DI, Stores, Reflector, Localization, Hosting modules

Coming soon — Copilot plugin install instructions will be added here.

View Skills Repository