Управление календарем, изменение цвета фона дня по клику - PullRequest
1 голос
/ 18 августа 2010

У меня есть расширенный элемент управления Calendar, связанный с классом, содержащим значения даты и состояния. Идея состоит в том, чтобы различать национальные праздники, государственные праздники и личные выходные. Я отображаю их в разных цветах, используя конвертер, который проверяет текущую дату по списку объектов, связанных с элементом управления календаря, чтобы выбрать цвет заливки для элемента в CalendarDay. Это все работает отлично.

Проблема заключается в том, что я хочу поддержать то, что когда пользователь нажимает на день (в заданном режиме), он может выбрать или отменить выбор этой даты как выходного / выходного дня. используя PreviewMouseDown, я выбираю объект по выбранному контексту данных (datetime) и обновляю его состояние. Это работает нормально, однако я не могу заставить элемент управления календаря выполнить обновление.

Календарь не привязан к моему пользовательскому классу, я не уверен точно, как привязан CalendarDay, но, похоже, он просто имеет контекст данных, указывающий на значение DateTime. Итак, NotifyPropertyChanged отсутствует. Если я нажимаю на дату и переключаю месяцы, а обратно, кажется, что день выделен, как и ожидалось, мне нужно, чтобы календарь перекрасился. Я искал примеры принудительного перекрашивания, и пока ничего не получалось.

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

1 Ответ

3 голосов
/ 18 августа 2010

НАКОНЕЦ нашел его. Отправка для процветания в случае, если другие пытались сделать что-то подобное.

Как уже упоминалось в комментарии, установка цвета заливки элемента изменила цвет фона, но в течение этого месяца это делалось для всех месяцев. На самом деле это имело смысл, поскольку заливка обычно управлялась шаблоном и задавалась на основе привязки и конвертера.

Решение состояло в том, чтобы сбросить привязку для события нажатия мыши при нажатии на дату. Это код события:

    protected override void OnPreviewMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e)
    {
        if (!(e.OriginalSource is FrameworkElement &&
            (e.OriginalSource as FrameworkElement).DataContext is DateTime))
        {
            base.OnPreviewMouseLeftButtonDown(e);
            return;
        }

        DateTime dateTime = (DateTime)(e.OriginalSource as FrameworkElement).DataContext;

        var calendarDay = _calendarDays.Single(d => d.CalendarDate == dateTime);

        if (calendarDay.IsHoliday)
        {
            calendarDay.CalendarKey = null;
        }
        else
        {
            calendarDay.CalendarKey = Guid.NewGuid();
        }
        var holidayBackgroundRect = VisualTreeHelper.GetChild(VisualTreeHelper.GetParent(e.OriginalSource as DependencyObject), 1) as Rectangle;
        var binding = new MultiBinding();
        binding.Bindings.Add(new Binding());
        binding.Bindings.Add(new Binding() { ElementName = "Calendar" });
        binding.Converter = new CalendarDayColorConverter();
        holidayBackgroundRect.SetBinding(Rectangle.FillProperty, binding);
        base.OnPreviewMouseLeftButtonDown(e);

    }

Конвертер определяет цвет дня. он принимает текущую привязанную дату из календаря и сам элемент управления календаря, где он может получить текущий список holidayDays.

Повторно указав привязку, она заставляет календарный день обновить эту дату.

Какая это была полная боль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...