码迷,mamicode.com
首页 > 其他好文 > 详细

WPF--Calendar控件高级使用

时间:2014-07-13 20:36:00      阅读:551      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

一、得到当前显示的月份:

      DateTime SelectedDay = this.MC.DisplayDate;

二、得到当前选中的天,得到当前选中的周,得到当前显示的月份:

      如果你使用系统默认的事件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)

事件的关键代码:

 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                  //获取选择的是星期几,如果点击“周1、周2、...周7”按钮,程序会走到此处来得出星期几。
20           int indexofWeek = (tb.Parent as Grid).Children.IndexOf(tb);
21                  //次方法能获取切换月份按钮后的当前月份
22                  DateTime SelectedDay = this.MC.DisplayDate;
23        }
24         }
25     }
26 }

 三、自定义日期的背景颜色

3.1、首先要自定义几个类,用于模板转换

 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模板的定义

bubuko.com,布布扣
 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 更新转换模板的List

 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         }

 

完整的例子:

下载连接

 

WPF--Calendar控件高级使用,布布扣,bubuko.com

WPF--Calendar控件高级使用

标签:style   blog   http   color   使用   os   

原文地址:http://www.cnblogs.com/badnewfish/p/3840969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!