WPF создание календаря с использованием сетки - PullRequest
0 голосов
/ 28 октября 2011

У меня есть конкретная проблема с моим календарем, который я создаю.Это трудно объяснить, но определив номер недели (месяца) и день недели, я делаю сетку.Даты не выстраиваются в правильном направлении.Пример: 1 октября 2011 года должно начаться в субботу, поскольку 1-е число - на неделе 1, но начинается в субботу, календарь должен выглядеть примерно так: (при условии, что для каждого дня есть квадраты сетки) Я знаю, почему возникает эта проблема, я простоне знаю как это исправить.Даты не располагаются в том месте, где они должны быть в сетке.

Календарь должен выглядеть следующим образом:

   Columns       October 2011    grid.column = 7 (0-6)  grid.row = 6 (0-5) (Sunday-Saturday)

     Sunday Monday Tuesday Wednesday Thursday Friday Saturday
row    0      1       2        3       4        5       6
0     ------------------------------------------------- 1st
1     2nd     3rd     4th     5th      6th-----------etc..--- 
2    --------------------------------------------etc...------
3    ------etc..---------------------------------------------
4    ---------------- 25th     26th    27th     28th    29th
5    30th     31st

Но мое выглядит так: (столбец 0-4 должен быть смещен вниз на одинряд)

    Sunday Monday Tuesday Wednesday Thursday Friday Saturday
row    0      1       2        3       4        5       6
0     2nd     3rd     4th     5th      6th------------- 1st
1     9th     10th     11th   12th     13th-----------etc..--- 
2    --------------------------------------------etc...------
3    ------etc..------25th     26th    27th-----------------
4    30th     31st--- ---------------------     28th    29th
5    -------------

Код:

public SchedulePage(MainWindow parentForm)
{
    InitializeComponent();

    _parentForm = parentForm;

    // DateTime date = new DateTime(year, month, day);
    var t = new List<Schedule>();
    DateTime curr = DateTime.Now;
    DateTime newcurr = new DateTime(curr.Year, curr.Month, 1);
    var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar;
    var ms = cal.GetWeekOfYear(new DateTime(newcurr.Year, newcurr.Month, 1), System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Sunday);

    for (var i = 1; newcurr.Month == curr.Month; newcurr = newcurr.AddDays(1))
    {
        var sched = new Schedule();
        var month_week = (newcurr.Day / 7) + 1;
        sched.MonthWeek = month_week.ToString();
        sched.Month = newcurr.Month.ToString();
        sched.Year = newcurr.Year.ToString();
        sched.day = newcurr.Day.ToString();
        sched.WeekOfYear = cal.GetWeekOfYear(newcurr, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString();
        sched.dayofweek = newcurr.DayOfWeek.ToString();
        t.Add(sched);

     /* if (newcurr.Day == 1 && (int)newcurr.DayOfWeek == 7)
        {
            int findspot = month_week - 1;

            //_parentForm.bindings.schedule.Add(new Schedule {
            //    WeekNo = month_week - findspot,
            //    WeekDay = (int)newcurr.DayOfWeek,
            //    day = newcurr.Day.ToString()
            //});
        } */

        _parentForm.bindings.schedule.Add(new Schedule {
            WeekNo = month_week - 1 ,
            WeekDay = (int)newcurr.DayOfWeek,
            day = newcurr.Day.ToString()
        });
    }
}

1 Ответ

3 голосов
/ 28 октября 2011

Вы используете (day / 7) + 1, чтобы получить WeekNo в этом месяце (строка №). Это будет неверно, если месяц не начинается в воскресенье.

Используйте код, найденный в этом SO-ответе , чтобы получить правильный номер недели в месяце

Создает ExtensionMethod для класса DateTime, который затем можно использовать, вызывая newcurr.GetWeekOfMonth()

static class DateTimeExtensions {
    static GregorianCalendar _gc = new GregorianCalendar();
    public static int GetWeekOfMonth(this DateTime time) {
        DateTime first = new DateTime(time.Year, time.Month, 1);
        return time.GetWeekOfYear() - first.GetWeekOfYear() + 1;
    }

    static int GetWeekOfYear(this DateTime time) {
        return _gc.GetWeekOfYear(time, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
    }
}
...