前回:http://blogs.wankuma.com/kazuki/archive/2008/01/20/118342.aspx
前回で、かなりそれっぽく表示されるようになった~。
月の始めと、終わりに前月・翌月の日付を差し込んで、カレンダーがぴっちり埋まるようにしてある。
でも、これってやらなくてもいいことがわかった…
カレンダーのレイアウトに使用している、UniformGridにはFirstColumnというプロパティがあって、これを指定すると最初の要素を何番目のカラムから始めるかってのが指定できる。
そんなわけで、ちょびっと改造。
DateTimeから、その月の日付のリストを返すコンバータから前月と翌月の日付をひっぱってくるコードを消して、純粋に今月分の日付のみを返すようにする。
namespace WpfCalendar
{
public class DateTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// 今までnullを気にしてなかった
if (value == null)
{
return new List();
}
DateTime date = (DateTime)value;
return (from day in Enumerable.Range(1, DateTime.DaysInMonth(date.Year, date.Month))
select new DateTime(date.Year, date.Month, day)).ToList();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
そして、月の始めの日付から、最初を何カラム目からはじめたらいいのかという値に変換するコンバータを1つこしらえる。
namespace WpfCalendar
{
public class DateTimeToFirstColumnConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return 0;
DateTime date = (DateTime)value;
return (int)new DateTime(date.Year, date.Month, 1).DayOfWeek;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
ListBoxのTemplateのカレンダーを表示するUniformGridのFirstColumnに↑のコンバータを設定したBindingを設定する。
# うわっ…なんか全部大文字になったうえに修正ができん…(追記)
この状態で実行すると、カレンダーの最初に適切な空白列が入るようになる。
ここらへん、どっちがいいかは好みの問題かな。
Windowsのカレンダーにあわせるなら、前月と翌月の日付も表示してあげたほうが自然っぽい。