代码之家  ›  专栏  ›  技术社区  ›  Steve Py

日历控件,单击时更改一天的背景色

wpf
  •  1
  • Steve Py  · 技术社区  · 16 年前

    我有一个扩展日历控件,它绑定到一个包含日期和状态值的类。这个想法本质上是区分国定假日、国定假日和个人休假。我使用转换器以不同的颜色呈现这些内容,该转换器根据与日历控件关联的对象列表检查当前日期,以便为日历日中的元素选择填充颜色。这一切都很好。

    日历没有绑定到我的自定义类,我不确定日历天是如何绑定的,但它似乎只有一个指向日期时间值的数据上下文。所以NotifyPropertyChanged已退出。如果我单击一个日期并切换月份,然后按预期突出显示日期,我需要告诉日历重新绘制。我一直在寻找强制重绘的例子,到目前为止什么都没有起作用。

    我试过UpdateLayout()等。我不知道这是否是一个问题,因为我正在尝试从鼠标事件中重新呈现。如何重新绘制日历控件以便启动转换器?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Steve Py    16 年前

    终于找到了。为了繁荣而发帖,以防其他人试图做类似的事情。

    正如评论中提到的,设置元素的填充颜色确实改变了背景颜色,但在所有的月份中,这一天都是这样。这实际上是有意义的,因为填充通常由模板管理,并基于绑定和转换器进行设置。

    解决方案是在单击日期时重置鼠标向下事件上的绑定。 这是事件代码:

        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);
    
        }
    

    转换器决定了一天的颜色。它接受来自日历的当前绑定日期,以及日历控件本身,从中可以检索当前假日列表。

    通过重新指定绑定,它强制日历日刷新该日期。

    那是多么痛苦啊。