Simple cross platform plugin for Calendar control featuring:
- Displaying events by binding EventCollection
- Localization support with System.Globalization.CultureInfo
- Customizable colors, day view sizes/label styles, custom Header/Footer template support
- UI reactive to EventCollection, Culture and other changes
We are open to any suggestions and feedback, and we got our community telegram group here :)
If you are coming back take a look on the Changelog here.
Android | iPhone |
---|---|
Android | iPhone |
---|---|
Android | iPhone |
---|---|
- Available on NuGet
Platform | Version |
---|---|
Xamarin.Forms | 4.5+ |
Xamarin.Android | 10.0+ |
Xamarin.iOS | 9.0+ |
To get started just install the package via Nuget into your shared and client projects. You can take a look on the sample app to get started or continue reading.
Reference the following xmlns to your page:
xmlns:controls="clr-namespace:Xamarin.Plugin.Calendar.Controls;assembly=Xamarin.Plugin.Calendar"
Basic control usage:
<controls:Calendar
Month="5"
Year="2019"
VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand">
Bindable properties:
Culture
CultureInfoMonth
intYear
intEvents
EventCollection (from package)- Custom colors, fonts, sizes ...
In your XAML, add the data template for events, and bind the events collection, example:
<controls:Calendar
Events="{Binding Events}">
<controls:Calendar.EventTemplate>
<DataTemplate>
<StackLayout
Padding="15,0,0,0">
<Label
Text="{Binding Name}"
FontAttributes="Bold"
FontSize="Medium" />
<Label
Text="{Binding Description}"
FontSize="Small"
LineBreakMode="WordWrap" />
</StackLayout>
</DataTemplate>
</controls:Calendar.EventTemplate>
</controls:Calendar>
In your ViewModel reference the following namespace:
using Xamarin.Plugin.Calendar.Models;
Add property for Events:
public EventCollection Events { get; set; }
Initialize Events with your data:
Events = new EventCollection
{
[DateTime.Now] = new List<EventModel>
{
new EventModel { Name = "Cool event1", Description = "This is Cool event1's description!" },
new EventModel { Name = "Cool event2", Description = "This is Cool event2's description!" }
},
// 5 days from today
[DateTime.Now.AddDays(5)] = new List<EventModel>
{
new EventModel { Name = "Cool event3", Description = "This is Cool event3's description!" },
new EventModel { Name = "Cool event4", Description = "This is Cool event4's description!" }
},
// 3 days ago
[DateTime.Now.AddDays(-3)] = new List<EventModel>
{
new EventModel { Name = "Cool event5", Description = "This is Cool event5's description!" }
},
// custom date
[new DateTime(2020, 3, 16))] = new List<EventModel>
{
new EventModel { Name = "Cool event6", Description = "This is Cool event6's description!" }
}
};
Initialize Events with your data and a different dot color per day:
Events = new EventCollection
{
//2 days ago
[DateTime.Now.AddDays(-2)] = new DayEventCollection<EventModel>( Color.Purple, Color.Purple)
{
new EventModel { Name = "Cool event1", Description = "This is Cool event1's description!" },
new EventModel { Name = "Cool event2", Description = "This is Cool event2's description!" }
},
// 5 days ago
[DateTime.Now.AddDays(-5)] = new DayEventCollection<EventModel>(Color.Blue, Color.Blue)
{
new EventModel { Name = "Cool event3", Description = "This is Cool event3's description!" },
new EventModel { Name = "Cool event4", Description = "This is Cool event4's description!" }
},
};
//4 days ago
Events.Add(DateTime.Now.AddDays(-4), new DayEventCollection<EventModel>(GenerateEvents(10, "Cool")) { EventIndicatorColor = Color.Green, EventIndicatorSelectedColor = Color.Green });
Where EventModel
is just an example, it can be replaced by any data model you desire.
EventsCollection
is just a wrapper over Dictionary<DateTime, ICollection>
exposing custom Add
method and this[DateTime]
indexer which internally extracts the .Date
component of DateTime
values and uses it as a key in this dictionary.
DayEventCollection
is just a wrapper over List<T>
exposing custom properties EventIndicatorColor
and EventIndicatorSelectedColor
for assigning a custom color to the dot.
Sample properties:
MonthLabelColor="Red"
YearLabelColor="Blue"
SelectedDateColor="Red"
SelectedDayBackgroundColor="DarkCyan"
EventIndicatorColor="Red"
EventIndicatorSelectedColor="White"
DaysTitleColor="Orange"
SelectedDayTextColor="Cyan"
DeselectedDayTextColor="Blue"
OtherMonthDayColor="Gray"
TodayOutlineColor="Blue"
TodayFillColor="Silver"
SelectedTodayTextColor="Green"
TodayTextColor="Yellow"
You can customize how will look event indication with property EventIndicatorType
- Available indicator are:
BottomDot
- event indicator as dot bellow of date in calendar (default value)TopDot
- event indicator as dot on top of date in calendarBackground
- event indicator as colored background in calendarBackgroundFull
// event indicator as larger size colored background in calendar
EventIndicatorType="Background"
You can write your own customizations commands for swipe.
SwipeLeftCommand="{Binding SwipeLeftCommand}"
SwipeRightCommand="{Binding SwipeRightCommand}"
SwipeUpCommand="{Binding SwipeUpCommand}"
You can also disable default swipe actions.
SwipeToChangeMonthEnabled="False"
SwipeUpToHideEnabled="False"
You can either use the default single selection mode with the 'Day' SelectionType enum value, where the date value binds to the SelectedDate property.
SelectionType="Day"
SelectedDate="{Binding SelectedDate}"
or the Range selection mode, where StartDate and EndDate bindings are required.
SelectionType="Range"
RangeSelectionStartDate="{Binding SelectedStartDate}"
RangeSelectionEndDate="{Binding SelectedEndDate}"
Enable/Disable animation when calendar is loaded or refreshed Sample properties:
AnimateCalendar="False"
There are several templates that can be used to customize the calendar. You can find an example for each one in the AdvancedPage.xaml. You can create your own custom control file or you can also write customization directly inside of Templates.
These sections provide customization over appearance of the controls of the calendar, like showing the selected month and year, month selection controls etc.
Customize the header section (top of the calendar control). Example from AdvancedPage.xaml
<plugin:Calendar.HeaderSectionTemplate>
<controls:CalendarHeader />
</plugin:Calendar.HeaderSectionTemplate>
Customize the footer section (under the calendar part, above the events list). Example from AdvancedPage.xaml
<plugin:Calendar.FooterSectionTemplate>
<DataTemplate>
<controls:CalendarFooter />
</DataTemplate>
</plugin:Calendar.FooterSectionTemplate>
Customize the bottom section (at the bottom of the calendar control, below the events list). Example from AdvancedPage.xaml
<plugin:Calendar.BottomSectionTemplate>
<controls:CalendarBottom />
</plugin:Calendar.BottomSectionTemplate>
These templates provide customization for the events list.
Customize the appearance of the events section. Example from AdvancedPage.xaml
<plugin:Calendar.EventTemplate>
<DataTemplate>
<controls:CalenderEvent CalenderEventCommand="{Binding BindingContext.EventSelectedCommand, Source={x:Reference advancedCalendarPage}}" />
</DataTemplate>
</plugin:Calendar.EventTemplate>
Customize what to show in case the selected date has no events. Example from AdvancedPage.xaml
<plugin:Calendar.EmptyTemplate>
<DataTemplate>
<StackLayout>
<Label Text="NO EVENTS FOR THE SELECTED DATE" HorizontalTextAlignment="Center" Margin="0,5,0,5" />
</StackLayout>
</DataTemplate>
</plugin:Calendar.EmptyTemplate>