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

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

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>

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();
  5. MC.DisplayDate = MC.DisplayDate.AddMonths(-);
  6. Thread.Sleep();
  7. dispatcherTimer.Stop();
  8. StartTimer = false;
  9. }

完整的例子:

下载连接

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. 【题解】【排列组合】【回溯】【Leetcode】Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  2. UI学习笔记---第十一天UITableView表视图高级-自定义cell

    自定义cell,多类型cell混合使用,cell自适应高度 自定义cell就是创建一个UITableViewCell的子类 把cell上的空间创建都封装在子类中,简化viewController中的代 ...

  3. Java-->分割文件

    --> 通过IO 流将一个文件分割成多份 package com.dragon.java.splitfile; import java.io.File; import java.io.FileI ...

  4. 227. Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  5. 2015GitWebRTC编译实录2

    2015.07.17libyuvneon编译通过,可能需要验证才行.先继续下一个lib commonaudio[170/1600 ] CXX obj /webrtc/common_audio/comm ...

  6. ZOJ 1016 Parencodings

    原题链接 题目大意:有两串数字P和W.数组P中,数字P[i]表示第i个右括号之前的左括号个数.数组W中,数字W[i]表示在第i个右括号和与它匹配的左括号之间的右括号的个数(包括本身).给出一个数组P, ...

  7. javascrip中的confirm小技巧

    jsp页面中的一个标签: <a href="javascript:void(0)" onclick="confirmDelete('<%=request.ge ...

  8. 论文笔记之:Multiple Object Recognition With Visual Attention

     Multiple Object Recognition With Visual Attention Google DeepMind  ICRL 2015 本文提出了一种基于 attention 的用 ...

  9. Textarea高度随内容自适应地增长,无滚动条

    <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; char ...

  10. 017. ADO.NET Connection和command及DataReader

    ADO.NET主要包括Connection , command , DataReader, DataSet, DataAdapter5个对象, 通过这5个对象可以对数据库进行查询, 添加, 修改及删除 ...