0

標準の WPF DatePicker を変更して、週を選択できるようにしたいと思います。SelectedDate として 1 つの DateTime が返されても問題ありませんが、マウスをホバーしたときに週の行全体を選択するには UI が必要です。

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

編集

現在のソリューションを回答として追加しました。現在行っている方法ではなく、範囲を強調する良い方法をまだ探しています。

4

1 に答える 1

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);
        }
    }
}
于 2013-03-11T15:02:26.800 に答える