private void DrawEvents() { // this method can be called when Events is not binded yet. So check that case and return if (Events == null) { return; } // when Events is binded, check if it is collection of ICalendarEvent (events must have DateFrom and DateTo) if (Events is IEnumerable <ICalendarEvent> events) { // add colors of events to array, to pick up them using number SolidColorBrush[] colors = { Color0, Color1, Color2 }; // index to array of colors int accentColor = 0; // loop all events foreach (var e in events.OrderBy(e => e.DateFrom)) { if (!e.DateFrom.HasValue || !e.DateTo.HasValue) { continue; } // number of row in day, in which event should be displayed int eventRow = 0; var dateFrom = (DateTime)e.DateFrom; var dateTo = (DateTime)e.DateTo; // loop all days of current event for (DateTime date = dateFrom; date <= dateTo; date = date.AddDays(1)) { // get DayOfWeek for current day of current event CalendarDay day = DaysInCurrentMonth.Where(d => d.Date.Date == date.Date).FirstOrDefault(); // day is in another mont, so skip it if (day == null) { continue; } // if the DayOfWeek is Monday, event shloud be displayed on first row if (day.Date.DayOfWeek == DayOfWeek.Monday) { eventRow = 0; } // but if there are some events before, event won't be on the first row, but after previous events if (day.Events.Children.Count > eventRow) { eventRow = Grid.GetRow(day.Events.Children[day.Events.Children.Count - 1]) + 1; } // get color for event int accentColorIndex = accentColor % colors.Count(); CalendarEventView calendarEventView = new CalendarEventView(colors[accentColorIndex], this); calendarEventView.DataContext = e; Grid.SetRow(calendarEventView, eventRow); day.Events.Children.Add(calendarEventView); } accentColor++; } } else { throw new ArgumentException("Events must be IEnumerable<ICalendarEvent>"); } }
public void DrawDays() { DaysGrid.Children.Clear(); DaysInCurrentMonth.Clear(); DateTime firstDayOfMonth = new DateTime(CurrentDate.Year, CurrentDate.Month, 1); DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1); for (DateTime date = firstDayOfMonth; date.Date <= lastDayOfMonth; date = date.AddDays(1)) { CalendarDay newDay = new CalendarDay(); newDay.BorderThickness = new Thickness((double)GridBorderThickness / 2); // /2 because neighbor day has border too, so two half borders next to each other will create final border newDay.BorderBrush = GridBrush; newDay.Date = date; DaysInCurrentMonth.Add(newDay); } int row = 0; int column = 0; for (int i = 0; i < DaysInCurrentMonth.Count; i++) { switch (DaysInCurrentMonth[i].Date.DayOfWeek) { case DayOfWeek.Monday: column = 0; break; case DayOfWeek.Tuesday: column = 1; break; case DayOfWeek.Wednesday: column = 2; break; case DayOfWeek.Thursday: column = 3; break; case DayOfWeek.Friday: column = 4; break; case DayOfWeek.Saturday: column = 5; break; case DayOfWeek.Sunday: column = 6; break; } Grid.SetRow(DaysInCurrentMonth[i], row); Grid.SetColumn(DaysInCurrentMonth[i], column); DaysGrid.Children.Add(DaysInCurrentMonth[i]); if (column == 6) { row++; } } DrawTopBorder(); DrawBottomBorder(); DrawRightBorder(); DrawLeftBorder(); // set some background today CalendarDay today = DaysInCurrentMonth.Where(d => d.Date == DateTime.Today).FirstOrDefault(); if (today != null) { today.DateTextBlock.Background = Color0; } DrawEvents(); }