2013-03-07 64 views
0

我想修改标准的WPF DatePicker以允许一周选择。如果我将单个DateTime作为SelectedDate返回,那很好,但是我需要UI在鼠标悬停时选择整个星期的行。更改WPF DatePicker一次选择一个星期

我已经继承并附加到SelectedDateChanged,以便它将返回StartDayOfWeek作为SelectedDate(代码如下)。

我已经知道如何突出显示整个星期(使用鼠标事件)。我希望有一个更简单的方法。

 // force selection to be for first previous start DOW 
     this.SelectedDateChanged += (sender, args) => { 
      var newDate = (DateTime) args.AddedItems[0]; 

      while (newDate.DayOfWeek != FirstDayOfWeek) 
       newDate = newDate.AddDays(-1); 

      SelectedDate = newDate; 
     }; 

编辑

我说我目前的解决方案作为一个答案。仍然在寻找一种突出范围的好方法,而不是我现在正在做的。

回答

0

想我会加上我目前的解决方案,这是为了防止任何不符合FirstDayOfWeek的日期,并确保如果他们超出我10年的范围,无论如何都会选择正确的日期。

public class LocalizedWeekPicker : LocalizedDatePicker 
{ 
    /// <summary> 
    /// An LocalizedDatePicker that disallows selecting any date that does not have the same DOW as the FirstDayOfWeek property. 
    /// It does this by disabling the dates N (currently=10) years forward and backward from today as well as automatically updating the date 
    /// if you choose something more than 10 years away from today. 
    /// </summary> 
    public LocalizedWeekPicker() : base() 
    { 
     this.Loaded += (s1, a1) => { 
      this.IsTodayHighlighted = false; 

      if (SelectedDate.HasValue) 
      { 
       var tempDate = new DateTime(SelectedDate.Value.Ticks); 
       SelectedDate = DateTimeUtils.GetPreviousDateOnDayOfWeek(FirstDayOfWeek, tempDate); 
      } 

      DisableDays(); 

      this.SelectedDateChanged += (s2, a2) => { 
       var tempDate = new DateTime(((DateTime)a2.AddedItems[0]).Ticks); 
       SelectedDate = DateTimeUtils.GetPreviousDateOnDayOfWeek(FirstDayOfWeek, tempDate); 
      }; 
     }; 
    } 

    // goes forward and back n years and disables dates that don't have the same start DOW as the FirstDayOfWeek 
    private void DisableDays() 
    { 
     int years = 10; 

     var current = DateTimeUtils.GetPreviousDateOnDayOfWeek(FirstDayOfWeek, DateTime.Now); 
     for (int weeks = 0; weeks < (52 * years); weeks++) 
     { 
      this.BlackoutDates.Add(new CalendarDateRange {Start = current.AddDays(1), End = current.AddDays(6)}); 
      current = current.AddDays(7); 
     } 

     current = DateTimeUtils.GetPreviousDateOnDayOfWeek(FirstDayOfWeek, DateTime.Now); 
     for (int weeks = 0; weeks < (52 * years); weeks++) 
     { 
      this.BlackoutDates.Add(new CalendarDateRange { Start = current.AddDays(1), End = current.AddDays(6) }); 
      current = current.AddDays(-7); 
     } 
    } 
} 
0

,你可以随时使用组件艺术控件或其他第三方的控制,因为他们有自定义日期控件每一个场景 - 我以前用过的部件艺术的控制,效果不错

+0

是的,我意识到这一点,但它不是在这种情况下的选项。 – JoeB 2013-03-07 17:10:26

相关问题