【问题标题】:Calendar control, change a day background colour on click日历控件,点击更改一天背景颜色
【发布时间】:2010-08-18 01:46:24
【问题描述】:

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

问题是我想支持当用户点击某一天(在给定模式下)时,他们可以选择或取消选择该日期作为休息日/节假日。使用 PreviewMouseDown 我通过选定的数据上下文(日期时间)选择对象并更新它的状态。这工作正常,但是我无法让日历控件执行刷新。

日历未绑定到我的自定义类,我不确定 CalendarDay 的确切绑定方式,但它似乎只有一个指向 DateTime 值的数据上下文。所以 NotifyPropertyChanged 出来了。如果我单击一个日期并切换月份并返回该日期按预期突出显示,我需要告诉日历重新绘制。我一直在寻找有关强制重绘的示例,但到目前为止没有任何效果。

我已经尝试过 UpdateLayout() 等。我不知道这是否是一个问题,因为我试图从鼠标事件中重新渲染。任何想法如何重新绘制日历控件以便可以启动转换器?

【问题讨论】:

  • 好的,我想我在这方面取得了一些进展,但还不是 100%。如果我添加这个: var test = VisualTreeHelper.GetChild(VisualTreeHelper.GetParent(e.OriginalSource as DependencyObject), 1) as Rectangle; test.Fill = new SolidColorBrush(Colors.Red); ...单击一天时的 mousedown 事件,我可以更改 CalendarDay 中元素的填充。我希望这会引发转换器覆盖设置的布局。不幸的是,它似乎已经覆盖了模板颜色。 (每个月的那一天都是红色的。)

标签: wpf


【解决方案1】:

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

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

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

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

    }

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

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

这是多么痛苦啊。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2019-09-27
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多