Skip to content
Shiny Controls v1.0 - The Ultra Control Suite for .NET MAUI & BlazorO...M...G!

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 GitHub stars for shinyorg/controls
MAUI NuGet downloads for Shiny.Maui.Controls
Blazor NuGet downloads for Shiny.Blazor.Controls
Frameworks
.NET MAUI
Blazor

MAUI

Calendar Agenda Event List
Calendar View Agenda View Event List View
Agenda with Calendar Picker

Blazor

Calendar view Agenda view Event list
Calendar view on Blazor Agenda view on Blazor Event list on Blazor
  • 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);
// Agenda drag/resize - default interface methods, so existing providers need no changes.
// See Drag & Drop Editing.
bool CanChangeEvent(SchedulerEvent evt) => false;
bool CanChangeEventTo(SchedulerEventChange change) => true;
Task<bool> OnEventChanged(SchedulerEventChange change) => Task.FromResult(false);
}

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@shiny

One plugin installs all 35 Shiny skills. Your agent loads only the skill relevant to what you're building, so there's no cost to having them all available.

copilot plugin marketplace add https://github.com/shinyorg/skills
copilot plugin install shiny@shiny

One plugin installs all 35 Shiny skills. Your agent loads only the skill relevant to what you're building, so there's no cost to having them all available.

View Skills Repository