Как создать элемент управления для просмотра месяца в Silverlight

Мне нужно создать внешний вид, например, monthview-control для отображения встреч. (сетка, показывающая все дни месяца, дни недели выровнены по вертикали. Номер дня и день недели должны отображаться для каждого дня, а встречи должны отображаться в виде списка внутри правильного дня)

И мне нужна информация о том, с чего начать.

Скажем, ViewModel будет выглядеть примерно так:

    public class MonthViewModel
{
    public List<DateTime> DaysInMonth { get; set; }
    public List<Appointment> Appointments { get; set; }
}
    public class Appointment
{
    public string Title { get; set; }
    public DateTime Start { get; set; }
    public string Description { get; set; }

}

Мне нужно вручную раскладывать дни и назначать встречи, или я могу сделать это более элегантно?

Я пробовал несколько аппорочей с привязкой, но все безуспешно. Любые подсказки о том, что делать?

С уважением Ларси


person Larsi    schedule 08.12.2009    source источник
comment
Из-за боли, связанной с ранним тестированием в бета-версии SL3 и получением практически полной работы, я без колебаний купил бы коммерчески доступный элемент управления, чтобы сделать это вместо этого. Это намного сложнее, чем кажется, особенно планировать многодневные встречи в компактной, но основанной на правилах манере.   -  person Andrew    schedule 08.12.2009
comment
Андрей, согласен - мне эта задача кажется намного сложнее, чем я думал. Я опубликую обновление, если найду хороший способ сделать это   -  person Larsi    schedule 10.12.2009


Ответы (1)


Я сделал именно это несколько недель назад. Что я сделал, так это создал два пользовательских элемента управления Silverlight, один для дня и один для месяца.

Элементы управления месяцем заполняют стековую панель с именем MonthRows элементами управления дня, как показано ниже:

        ViewStartDate = new DateTime(CurrentDate.Year, CurrentDate.Month, 1);
        ViewEndDate = ViewStartDate.AddMonths(1).AddDays(-1);

        while (ViewStartDate.DayOfWeek != System.DayOfWeek.Sunday)
        {
            ViewStartDate = ViewStartDate.AddDays(-1);
        }
        while (ViewEndDate.DayOfWeek != System.DayOfWeek.Saturday)
        {
            ViewEndDate = ViewEndDate.AddDays(1);
        }

        DateTime tmpDate = ViewStartDate;
        while (tmpDate <= ViewEndDate)
        {
            StackPanel stack = new StackPanel()
            {
                Orientation = Orientation.Horizontal
            };

            for (int i = 0; i < 7; i++)
            {
                stack.Children.Add(new ucDay(tmpDate.Year, tmpDate.Month, tmpDate.Day, EventFunc, CurrentDate));
                tmpDate = tmpDate.AddDays(1);
            }
            MonthRows.Children.Add(stack);
        }

Конструктор ucDay принимает в качестве параметров год, месяц, день, указатель функции делегата (для обработки событий щелчка) и текущую выбранную дату.

person JML    schedule 08.12.2009