WPF--Calendar控件高级使用

1、获得当前显示的月份:ide

      DateTime SelectedDay = this.MC.DisplayDate;this

2、获得当前选中的天,获得当前选中的周,获得当前显示的月份:spa

      若是你使用系统默认的事件SelectedDateChanged是很难获取焦点的,给Calendar注册MC_MouseLeftButtonUp事件设计

      

1  //在初始化时注册事件
2  MC.AddHandler(Button.MouseLeftButtonDownEvent, new RoutedEventHandler(MC_MouseLeftButtonUp), true); 3 
4 private void MC_MouseLeftButtonUp(object sender, RoutedEventArgs e)

事件的关键代码:code

 1 if (sender is Calendar)  2 {  3     if (MC.InputHitTest(Mouse.GetPosition(e.Source as FrameworkElement)) is TextBlock)  4  {  5         TextBlock tb = MC.InputHitTest(Mouse.GetPosition(e.Source as FrameworkElement))  6  as TextBlock;//本行代码是个关键,使用了WPF内置的碰撞检测  7         if (tb != null)  8  {  9 
10             try
11  { 12                 //获取选择的是哪一天
13                 int.Parse(tb.Text); 14  } 15        
16        catch (Exception ex) //Click The WeekDaysButton
17        { 18 
19                  //获取选择的是星期几,若是点击“周一、周二、...周7”按钮,程序会走到此处来得出星期几。
20           int indexofWeek = (tb.Parent as Grid).Children.IndexOf(tb); 21                  //次方法能获取切换月份按钮后的当前月份
22                  DateTime SelectedDay = this.MC.DisplayDate; 23        } 24  } 25  } 26 }

 3、自定义日期的背景颜色对象

3.一、首先要自定义几个类,用于模板转换blog

 1   public class CustemItems  2  {  3         bool isSpecific;  4 
 5         public bool IsSpecific  6  {  7             get { return isSpecific; }  8             set { isSpecific = value; }  9  } 10 
11  DateTime d; 12 
13         public DateTime Dete 14  { 15             get { return d; } 16             set { d = value; } 17  } 18         string s; 19 
20         public string StrOfColor 21  { 22             get { return s; } 23             set { s = value; } 24  } 25         public CustemItems(DateTime d, string str) 26  { 27             Dete = d; 28             StrOfColor = str; 29  } 30     }
 1 public class BlueLetterDayConverter : IValueConverter  2  {  3         public static List<CustemItems> dict = new List<CustemItems>();  4        
 5 
 6         static BlueLetterDayConverter()  7  {  8             
 9  } 10 
11         public object Convert(object value, Type targetType, 12                               object parameter, CultureInfo culture) 13  { 14             string text = null; 15             for (int i = 0; i < dict.Count; i++) 16  { 17                 if (dict[i].Dete == (DateTime)value) 18  { 19                     text = dict[i].StrOfColor; 20  } 21  } 22 
23             return text; 24  } 25 
26         public object ConvertBack(object value, Type targetType, 27                                   object parameter, CultureInfo culture) 28  { 29             return null; 30  } 31         public void Add(DateTime date, string str) 32  { 33             dict.Add(new CustemItems(date, str)); 34  } 35 
36         public static void Update(List<CustemItems> MIList) 37  { 38  dict.Clear(); 39             dict = MIList; 40  } 41 
42     }
public class RedLetterDayConverter : IValueConverter { public static List<CustemItems> dict = new List<CustemItems>(); static RedLetterDayConverter() { } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { string text = null; for (int i = 0; i < dict.Count; i++) { if (dict[i].Dete == (DateTime)value) { text = dict[i].StrOfColor; } } return text; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return null; } public void Add(DateTime date, string str) { dict.Add(new CustemItems(date, str)); } public static void Update(List<CustemItems> MIList) { dict.Clear(); dict = MIList; } }

3.2 Calendar模板的定义事件

 1   <Calendar x:Name="MC" HorizontalAlignment="Left" VerticalAlignment="Top" 
 2                   MouseLeftButtonDown="MC_MouseLeftButtonUp"
 3                  >
 4             <Calendar.CalendarDayButtonStyle>
 5                 <Style TargetType="{x:Type CalendarDayButton}">
 6                     <Setter Property="Template">
 7                         <Setter.Value>
 8                             <ControlTemplate TargetType="{x:Type CalendarDayButton}" x:Name="CalendarDayButtonControlTemplate">
 9                                 <ControlTemplate.Resources>
10                                     <src:RedLetterDayConverter x:Key="convRed" />
11                                     <src:BlueLetterDayConverter x:Key="convBlue" />
12                                 </ControlTemplate.Resources>
13                                 <Grid>
14                                     <Rectangle x:Name="RedLetterDayBackground" IsHitTestVisible="False" Fill="Red"/>
15                                     <Rectangle x:Name="BlueLetterDayConverter" IsHitTestVisible="False" Fill="Blue"/>
16 
17                                     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
18                                                       VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="5,1,5,1"/>
19                                 </Grid>
20                                 <ControlTemplate.Triggers>
21                                     <DataTrigger Binding="{Binding Converter={StaticResource convRed}}"  Value="{x:Null}">
22                                         <Setter TargetName="RedLetterDayBackground" Property="Visibility" Value="Hidden" />
23                                     </DataTrigger>
24                                     <DataTrigger Binding="{Binding Converter={StaticResource convBlue}}"  Value="{x:Null}">
25                                         <Setter TargetName="BlueLetterDayConverter" Property="Visibility" Value="Hidden" />
26                                     </DataTrigger>
27                                 </ControlTemplate.Triggers>
28                             </ControlTemplate>
29                         </Setter.Value>
30                     </Setter>
31                 </Style>
32             </Calendar.CalendarDayButtonStyle>
33 
34         </Calendar>
View Code

3.3 更新转换模板的Listci

 1 List<CustemItems> ItemListRed = new List<CustemItems>();
 2 List<CustemItems> ItemListBule = new List<CustemItems>();
 3 
 4 ...
 5 
 6 RedLetterDayConverter.Update(ItemListRed);
 7 BlueLetterDayConverter.Update(ItemListBule);
 8 if (!StartTimer)
 9 {
10     dispatcherTimer.Start();
11  }

 

3.4 重点:资源

  由于从根本上讲ControlTemplate.Resources是一个静态的资源,它没法作到资源变动后,系统自动会通知控件(或者控件模板)去更新对应的UI显示,这个在《WPF程序设计指南[Charles Petzold]》书中的第535页至539页有详细介绍。因此咱们要在变动RedLetterDayConverter 或者BlueLetterDayConverter里面的List<>对象之后,须要使用一个Timer去手动更新UI,从而触发模板的更新。 

 

1 void dispatcherTimer_Tick(object sender, EventArgs e)
2         {
3             StartTimer = true;
4             MC.DisplayDate = MC.DisplayDate.AddMonths(1);
5             MC.DisplayDate = MC.DisplayDate.AddMonths(-1);
6             Thread.Sleep(50);
7             dispatcherTimer.Stop();
8             StartTimer = false;
9         }

 

完整的例子:

下载链接

相关文章
相关标签/搜索