Beispiel #1
0
        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>");
            }
        }
Beispiel #2
0
        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();
        }