更改日历控件中某些假期日期的背景
Change background of some holiday dates in Calendar control
我在 wpf 桌面应用程序中使用基本日历控件,我的要求是使用 c# 语言将假期(来自 mysql 数据库的日期)与常规日期区分开来。我的代码是这样的:
<Calendar Name="MyCalendar" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" Grid.RowSpan="6" Foreground="Aqua" SelectionMode="MultipleRange" SelectedDatesChanged="MyCalendar_SelectedDatesChanged" ></Calendar>
C# :
private void MyCalendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{
listboxSelectedDates.Items.Clear();
foreach (DateTime dr in MyCalendar.SelectedDates)
{
listboxSelectedDates.Items.Add(dr.ToShortDateString());
}//add selected dates in list
MySqlConnection conn = new MySqlConnection("Server=localhost;database=newcompanydatabase;pwd=Admin@123;uid=root;");
string q = "select _date from event_calendar;";
MySqlCommand cmd = new MySqlCommand(q,conn);
conn.Open();
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
if(MyCalendar.SelectedDate==rdr.GetDateTime(0))
{
MessageBox.Show("******* holiday");
}
}//if selected date is holiday, show occasion.
}
如何使用 C# 更改假期的背景色?
有多种方法可以实现您的目标,但我将专注于一种特定的解决方案。
概念
我们将定义一个助手 class,它将有两个附加的依赖属性,稍后我们将附加到表示 Calendar
控件中特定日期的控件。这些将是 Date
- 标识控件表示的日期,以及 IsHoliday
- 只读 属性 指示日期(由 Date
标识)是否为假日.然后我们将在每个控件上设置一个触发器,只要该控件的 IsHoliday
为 true
就会更改其背景。
实施
首先,帮手 class:
namespace MyHelpers
{
public class HolidayHelper
{
public static DateTime GetDate(DependencyObject obj)
{
return (DateTime)obj.GetValue(DateProperty);
}
public static void SetDate(DependencyObject obj, DateTime value)
{
obj.SetValue(DateProperty, value);
}
public static readonly DependencyProperty DateProperty =
DependencyProperty.RegisterAttached("Date", typeof(DateTime), typeof(HolidayHelper), new PropertyMetadata { PropertyChangedCallback = DatePropertyChanged });
private static void DatePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var date = GetDate(d);
SetIsHoliday(d, CheckIsHoliday(date));
}
private static bool CheckIsHoliday(DateTime date)
{
//here we should determine whether 'date' is a holiday
//or not and return corresponding value
}
private static readonly DependencyPropertyKey IsHolidayPropertyKey =
DependencyProperty.RegisterAttachedReadOnly("IsHoliday", typeof(bool), typeof(HolidayHelper), new PropertyMetadata());
public static readonly DependencyProperty IsHolidayProperty = IsHolidayPropertyKey.DependencyProperty;
public static bool GetIsHoliday(DependencyObject obj)
{
return (bool)obj.GetValue(IsHolidayProperty);
}
private static void SetIsHoliday(DependencyObject obj, bool value)
{
obj.SetValue(IsHolidayPropertyKey, value);
}
}
}
每当 Date
属性 附加到任何 DependencyObject
或其值发生变化时,IsHoliday
属性 将相应更新。
现在有一些有用的事实:
Calendar
控件中的每个日期都由 CalendarDayButton
控件显示
- 对于每个
CalendarDayButton
控件,相应的日期存储在其 DataContext
属性 中
- 可以使用
Calendar.CalendarDayButtonStyle
属性 为特定 Calendar
自定义 CalendarDayButton
控件
我们需要做的是绑定HolidayHelper.Date
属性到CalendarDayButton.DataContext
,并在HolidayHelper.IsHoliday
上设置触发器来更新CalendarDayButton.Background
:
<Calendar xmlns:helpers="clr-namespace:MyHelpers">
<Calendar.CalendarDayButtonStyle>
<Style TargetType="{x:Type CalendarDayButton}">
<Setter Property="helpers:HolidayHelper.Date" Value="{Binding}" />
<Style.Triggers>
<Trigger Property="helpers:HolidayHelper.IsHoliday" Value="True">
<Setter Property="Background" Value="..." />
</Trigger>
</Style.Triggers>
</Style>
</Calendar.CalendarDayButtonStyle>
</Calendar>
我们可以为每个假期创建一个 DataTrigger
。
<Style x:Key="cdbKey" TargetType="CalendarDayButton">
<Style.Triggers>
<DataTrigger Binding="{Binding Date}" Value="12/07/2015">
<Setter Property="Background" Value="Turquoise"/>
</DataTrigger>
... more such DataTriggers for every holiday
</Style.Triggers>
</Style>
但是由于假期日期存储在数据库中,因此我们需要在循环中使用代码添加 DataTrigger
。
定义 Style
定位 CalenderDayButton
.
<Style x:Key="cdbKey" TargetType="CalendarDayButton">
...
</Style>
设置CalendarDayButtonStyle
属性
<Calendar ... CalendarDayButtonStyle="{StaticResource cdbKey}">
从数据库中的适当位置获取您的假期日期(window 构造函数等)。
List<DateTime> holidaysDates = _getHolidayDatesFromDB();
使用循环为第 3 步中收到的假期日期列表添加 DataTriggers
,使用 C# 代码并将它们添加到上面定义的 Style
。
Style s = (Style)this.Resources["cdbKey"];
/* Loop through the Dates retrieved from DataBase*/
DateTime holidayDate = DateTime.Parse("10/02/2015");
DataTrigger dataTrigger = new DataTrigger() { Binding = new Binding("Date"), Value = holidayDate };
dataTrigger.Setters.Add(new Setter(CalendarDayButton.BackgroundProperty, Brushes.SandyBrown));
s.Triggers.Add(dataTrigger);
/*End Loop*/
我们在 DataTrigger
中使用 Binding("Date")
作为我们的 Binding
属性 值,这是因为 CalenderDayButton
自动设置了 DataContext
DateTime
值。
我已经把CalenderDayButton
的Background
改成SandyBrown了,你可以再好看点。
我在 wpf 桌面应用程序中使用基本日历控件,我的要求是使用 c# 语言将假期(来自 mysql 数据库的日期)与常规日期区分开来。我的代码是这样的:
<Calendar Name="MyCalendar" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" Grid.RowSpan="6" Foreground="Aqua" SelectionMode="MultipleRange" SelectedDatesChanged="MyCalendar_SelectedDatesChanged" ></Calendar>
C# :
private void MyCalendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{
listboxSelectedDates.Items.Clear();
foreach (DateTime dr in MyCalendar.SelectedDates)
{
listboxSelectedDates.Items.Add(dr.ToShortDateString());
}//add selected dates in list
MySqlConnection conn = new MySqlConnection("Server=localhost;database=newcompanydatabase;pwd=Admin@123;uid=root;");
string q = "select _date from event_calendar;";
MySqlCommand cmd = new MySqlCommand(q,conn);
conn.Open();
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
if(MyCalendar.SelectedDate==rdr.GetDateTime(0))
{
MessageBox.Show("******* holiday");
}
}//if selected date is holiday, show occasion.
}
如何使用 C# 更改假期的背景色?
有多种方法可以实现您的目标,但我将专注于一种特定的解决方案。
概念
我们将定义一个助手 class,它将有两个附加的依赖属性,稍后我们将附加到表示 Calendar
控件中特定日期的控件。这些将是 Date
- 标识控件表示的日期,以及 IsHoliday
- 只读 属性 指示日期(由 Date
标识)是否为假日.然后我们将在每个控件上设置一个触发器,只要该控件的 IsHoliday
为 true
就会更改其背景。
实施
首先,帮手 class:
namespace MyHelpers
{
public class HolidayHelper
{
public static DateTime GetDate(DependencyObject obj)
{
return (DateTime)obj.GetValue(DateProperty);
}
public static void SetDate(DependencyObject obj, DateTime value)
{
obj.SetValue(DateProperty, value);
}
public static readonly DependencyProperty DateProperty =
DependencyProperty.RegisterAttached("Date", typeof(DateTime), typeof(HolidayHelper), new PropertyMetadata { PropertyChangedCallback = DatePropertyChanged });
private static void DatePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var date = GetDate(d);
SetIsHoliday(d, CheckIsHoliday(date));
}
private static bool CheckIsHoliday(DateTime date)
{
//here we should determine whether 'date' is a holiday
//or not and return corresponding value
}
private static readonly DependencyPropertyKey IsHolidayPropertyKey =
DependencyProperty.RegisterAttachedReadOnly("IsHoliday", typeof(bool), typeof(HolidayHelper), new PropertyMetadata());
public static readonly DependencyProperty IsHolidayProperty = IsHolidayPropertyKey.DependencyProperty;
public static bool GetIsHoliday(DependencyObject obj)
{
return (bool)obj.GetValue(IsHolidayProperty);
}
private static void SetIsHoliday(DependencyObject obj, bool value)
{
obj.SetValue(IsHolidayPropertyKey, value);
}
}
}
每当 Date
属性 附加到任何 DependencyObject
或其值发生变化时,IsHoliday
属性 将相应更新。
现在有一些有用的事实:
Calendar
控件中的每个日期都由CalendarDayButton
控件显示- 对于每个
CalendarDayButton
控件,相应的日期存储在其DataContext
属性 中
- 可以使用
Calendar.CalendarDayButtonStyle
属性 为特定
Calendar
自定义 CalendarDayButton
控件
我们需要做的是绑定HolidayHelper.Date
属性到CalendarDayButton.DataContext
,并在HolidayHelper.IsHoliday
上设置触发器来更新CalendarDayButton.Background
:
<Calendar xmlns:helpers="clr-namespace:MyHelpers">
<Calendar.CalendarDayButtonStyle>
<Style TargetType="{x:Type CalendarDayButton}">
<Setter Property="helpers:HolidayHelper.Date" Value="{Binding}" />
<Style.Triggers>
<Trigger Property="helpers:HolidayHelper.IsHoliday" Value="True">
<Setter Property="Background" Value="..." />
</Trigger>
</Style.Triggers>
</Style>
</Calendar.CalendarDayButtonStyle>
</Calendar>
我们可以为每个假期创建一个 DataTrigger
。
<Style x:Key="cdbKey" TargetType="CalendarDayButton">
<Style.Triggers>
<DataTrigger Binding="{Binding Date}" Value="12/07/2015">
<Setter Property="Background" Value="Turquoise"/>
</DataTrigger>
... more such DataTriggers for every holiday
</Style.Triggers>
</Style>
但是由于假期日期存储在数据库中,因此我们需要在循环中使用代码添加 DataTrigger
。
定义
Style
定位CalenderDayButton
.<Style x:Key="cdbKey" TargetType="CalendarDayButton"> ... </Style>
设置
CalendarDayButtonStyle
属性<Calendar ... CalendarDayButtonStyle="{StaticResource cdbKey}">
从数据库中的适当位置获取您的假期日期(window 构造函数等)。
List<DateTime> holidaysDates = _getHolidayDatesFromDB();
使用循环为第 3 步中收到的假期日期列表添加
DataTriggers
,使用 C# 代码并将它们添加到上面定义的Style
。Style s = (Style)this.Resources["cdbKey"]; /* Loop through the Dates retrieved from DataBase*/ DateTime holidayDate = DateTime.Parse("10/02/2015"); DataTrigger dataTrigger = new DataTrigger() { Binding = new Binding("Date"), Value = holidayDate }; dataTrigger.Setters.Add(new Setter(CalendarDayButton.BackgroundProperty, Brushes.SandyBrown)); s.Triggers.Add(dataTrigger); /*End Loop*/
我们在
DataTrigger
中使用Binding("Date")
作为我们的Binding
属性 值,这是因为CalenderDayButton
自动设置了DataContext
DateTime
值。
我已经把CalenderDayButton
的Background
改成SandyBrown了,你可以再好看点。