如何检测WPF日历控件上的自动月移?

时间:2013-11-22 18:24:07

标签: c# wpf user-interface user-controls calendar

我正在尝试创建一个允许用户点击和切换所选日期的日历。因此,他们单击他们想要包含的每个日期,并且一次选择一个(不使用ctrl或shift键)。无论如何,要实现这一点,我将两个日历放在我的控制之上。我做了一个不透明的,让另一个没有点击测试可见:

    <Calendar x:Name="_visibleCalendar" SelectionMode="MultipleRange" IsHitTestVisible="False" Margin="0,0,0,-46"/>
    <Calendar x:Name="_selectableCalendar" Opacity="0.5" SelectedDatesChanged="DateClicked" VerticalAlignment="Bottom"/>


    private void DateClicked(object sender, SelectionChangedEventArgs e)
    {
        DateTime? date = _selectableCalendar.SelectedDate;
        _selectableCalendar.SelectedDate = null;

        if (date != null)
        {
            if (_visibleCalendar.SelectedDates.Contains((DateTime) date))
            {
                _visibleCalendar.SelectedDates.Remove((DateTime) date);
            }
            else
            {
                _visibleCalendar.SelectedDates.Add((DateTime) date);
            }
        }
    }

这样做可以让用户点击_selectableCalendar并将其选择添加到_visibleCalendar.SelectedDates

如果我自己这么说的话,有点酷的黑客。除了用户在隐形日历上更改月份外,它的工作效果很好。

所以,我需要知道的是如何检测日历已经转移到显示不同的月份?

我尝试过使用DisplayDateStartDisplayDateEnd,但这些始终为空。

此外,(奖金问题)是否有一种简单的方法可以用不同颜色突出日历上的日期?喜欢用交替的颜色突出每一天?红色,蓝色,红色等。?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

天真的方法

private void DateClicked(object sender, SelectionChangedEventArgs e)
{
    var dt = selectableCalendar.SelectedDate;
    if (_curr == null)
        _curr = selectableCalendar.SelectedDate;

    if (((DateTime)_curr).Month != ((DateTime)dt).Month)
    {
        _curr = dt;
        // blah
    }
}

在类范围中声明DateTime? _curr;的位置 根据您的要求,合并if语句。