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

DateTime SelectedDay = this.MC.DisplayDate;

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

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

  //在初始化时注册事件
  MC.AddHandler(Button.MouseLeftButtonDownEvent, new RoutedEventHandler(MC_MouseLeftButtonUp), true);

 private void MC_MouseLeftButtonUp(object sender, RoutedEventArgs e)

事件的关键代码:

 if (sender is Calendar)
 {
     if (MC.InputHitTest(Mouse.GetPosition(e.Source as FrameworkElement)) is TextBlock)
     {
         TextBlock tb = MC.InputHitTest(Mouse.GetPosition(e.Source as FrameworkElement))
  as TextBlock;//本行代码是个关键,使用了WPF内置的碰撞检测
         if (tb != null)
         {

             try
             {
                 //获取选择的是哪一天
                 int.Parse(tb.Text);
             }
        
        catch (Exception ex) //Click The WeekDaysButton
        {

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

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

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

   public class CustemItems
     {
         bool isSpecific;

         public bool IsSpecific
         {
             get { return isSpecific; }
             set { isSpecific = value; }
         }

         DateTime d;

         public DateTime Dete
         {
             get { return d; }
             set { d = value; }
         }
         string s;

         public string StrOfColor
         {
             get { return s; }
             set { s = value; }
         }
         public CustemItems(DateTime d, string str)
         {
             Dete = d;
             StrOfColor = str;
         }
     }
 public class BlueLetterDayConverter : IValueConverter
     {
         public static List<CustemItems> dict = new List<CustemItems>();

         static BlueLetterDayConverter()
         {

         }

         public object Convert(object value, Type targetType,
                               object parameter, CultureInfo culture)
         {
             string text = null;
             ; 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;
         }

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

   <Calendar x:Name="MC" HorizontalAlignment="Left" VerticalAlignment="Top"
                   MouseLeftButtonDown="MC_MouseLeftButtonUp"
                  >
             <Calendar.CalendarDayButtonStyle>
                 <Style TargetType="{x:Type CalendarDayButton}">
                     <Setter Property="Template">
                         <Setter.Value>
                             <ControlTemplate TargetType="{x:Type CalendarDayButton}" x:Name="CalendarDayButtonControlTemplate">
                                 <ControlTemplate.Resources>
                                     <src:RedLetterDayConverter x:Key="convRed" />
                                     <src:BlueLetterDayConverter x:Key="convBlue" />
                                 </ControlTemplate.Resources>
                                 <Grid>
                                     <Rectangle x:Name="RedLetterDayBackground" IsHitTestVisible="False" Fill="Red"/>
                                     <Rectangle x:Name="BlueLetterDayConverter" IsHitTestVisible="False" Fill="Blue"/>

                                     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                       VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="5,1,5,1"/>
                                 </Grid>
                                 <ControlTemplate.Triggers>
                                     <DataTrigger Binding="{Binding Converter={StaticResource convRed}}"  Value="{x:Null}">
                                         <Setter TargetName="RedLetterDayBackground" Property="Visibility" Value="Hidden" />
                                     </DataTrigger>
                                     <DataTrigger Binding="{Binding Converter={StaticResource convBlue}}"  Value="{x:Null}">
                                         <Setter TargetName="BlueLetterDayConverter" Property="Visibility" Value="Hidden" />
                                     </DataTrigger>
                                 </ControlTemplate.Triggers>
                             </ControlTemplate>
                         </Setter.Value>
                     </Setter>
                 </Style>
             </Calendar.CalendarDayButtonStyle>

         </Calendar>

3.3 更新转换模板的List

 List<CustemItems> ItemListRed = new List<CustemItems>();
 List<CustemItems> ItemListBule = new List<CustemItems>();

 ...

 RedLetterDayConverter.Update(ItemListRed);
 BlueLetterDayConverter.Update(ItemListBule);
 if (!StartTimer)
 {
     dispatcherTimer.Start();
  }

3.4 重点:

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

 void dispatcherTimer_Tick(object sender, EventArgs e)
         {
             StartTimer = true;
             MC.DisplayDate = MC.DisplayDate.AddMonths();
             MC.DisplayDate = MC.DisplayDate.AddMonths(-);
             Thread.Sleep();
             dispatcherTimer.Stop();
             StartTimer = false;
         }

完整的例子:

下载连接

WPF--Calendar控件高级使用的更多相关文章

  1. WPF常用控件应用demo

    WPF常用控件应用demo 一.Demo 1.Demo截图如下: 2.demo实现过程 总体布局:因放大缩小窗体,控件很根据空间是否足够改变布局,故用WrapPanel布局. <ScrollVi ...

  2. 【转】WPF - 第三方控件

    WPF - 第三方控件 目前第三方控件在网上形成巨大的共享资源,其中包括收费的也有免费的,有开源的也有不开源的,合理的使用第三方控件将使项目组的工作事半功倍.比如项目中有些复杂的业务逻辑.有些绚丽的效 ...

  3. WPF Popup 控件导致被遮挡内容不刷新的原因

    WPF Popup 控件导致被遮挡内容不刷新的原因 周银辉 今天在写一个WPF控件时用到了Popup控件,很郁闷的情况是:当popup关闭时,原来被popup挡住的界面部分不刷新,非要手动刷新一下(比 ...

  4. 创建 WPF 工具箱控件

    创建 WPF 工具箱控件 WPF (Windows Presentation Framework) 工具箱控件模板允许您创建 WPF 控件,会自动添加到 工具箱 安装扩展的安装. 本主题演示如何使用模 ...

  5. [习题]日历(Calendar)控件的障眼法(.Visible属性),使用时才出现?不用就消失?

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/02/calendar_icon_visible.aspx [习题]日历(Cal ...

  6. wpf打印控件 实现分页打印控件功能

    因为 要实现打印 wpf  listbox控件  数据特别多 要打印在 几张纸上    找了几天 都没有找到相关的例子 现在 解决了 在这里和大家分享一下 public void print(Fram ...

  7. asp.net 弹出式日历控件 选择日期 Calendar控件

    原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...

  8. WPF 分页控件 WPF 多线程 BackgroundWorker

    WPF 分页控件 WPF 多线程 BackgroundWorker 大家好,好久没有发表一篇像样的博客了,最近的开发实在头疼,很多东西无从下口,需求没完没了,更要命的是公司的开发从来不走正规流程啊, ...

  9. WPF Image控件中的ImageSource与Bitmap的互相转换

    原文:WPF Image控件中的ImageSource与Bitmap的互相转换  1.从bitmap转换成ImageSource [DllImport("gdi32.dll", ...

  10. ASP.NET Calendar 控件

    ASP.NET Calendar 控件 http://www.w3school.com.cn/aspnet/control_calendar.asp

随机推荐

  1. MySQL单表多字段模糊查询解决方法

    例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍.然后根据用户输入的查询请求,将输入的字串通过空格分割为多个关键字,再在这三个字段中查 ...

  2. PostgreSQL增删数据命令示例

    在PostgreSQL中如何用简单的几条SQL语句生成大量的测试数据呢? 此处,我简单的写一个例子,供参考(在Postgresql9.1下面做的): (1)生成一万条测试数据的表foo mydb=# ...

  3. Kmeans算法的应用实例(Matlab版本)

    K-means是一种经典的聚类算法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最 ...

  4. 【转】Entity Framework技术导游系列开篇与热身

    转自:http://blog.csdn.net/bitfan/article/details/12779517 Entity Framework走马观花 之 把握全局 ================ ...

  5. JavaScript BOM 遗漏知识再整理;弹窗和记时事件;

    1.JavaScript 弹窗 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. window.alert() 方法可以不带上window对象, ...

  6. leetcode 146. LRU Cache ----- java

    esign and implement a data structure for Least Recently Used (LRU) cache. It should support the foll ...

  7. 越狱Season 1-Episode 11: And Then There Were 7-M

    Season 1, Episode 11: And Then There Were 7-M -Michael: That one 那个 -businessman: Nice choice choice ...

  8. html5 input type=search

    <style> input[type="search"]{ border-radius:2px;} input::-webkit-search-cancel-butto ...

  9. 【P1326】超级教主

    DP优化 原题: LHX教主很能跳,因为Orz他的人太多了.教主跳需要消耗能量,每跳1米就会消耗1点能量,如果教主有很多能量就能跳很高.教主为了收集能量,来到了一个神秘的地方,这个地方凡人是进不来的. ...

  10. Android Facebook和Twitter分享

    1. 背景 在年初的时候,公司的项目有个新的需求,在英文版的应用中加入Facebook和Twitter分享功能. 2. 完成情况 由于这个项目比较急,所以开发这个功能从预研到接入总共耗时一周.后来,在 ...