WPF--Calendar控件高级使用
一、得到当前显示的月份:
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控件高级使用的更多相关文章
- WPF常用控件应用demo
WPF常用控件应用demo 一.Demo 1.Demo截图如下: 2.demo实现过程 总体布局:因放大缩小窗体,控件很根据空间是否足够改变布局,故用WrapPanel布局. <ScrollVi ...
- 【转】WPF - 第三方控件
WPF - 第三方控件 目前第三方控件在网上形成巨大的共享资源,其中包括收费的也有免费的,有开源的也有不开源的,合理的使用第三方控件将使项目组的工作事半功倍.比如项目中有些复杂的业务逻辑.有些绚丽的效 ...
- WPF Popup 控件导致被遮挡内容不刷新的原因
WPF Popup 控件导致被遮挡内容不刷新的原因 周银辉 今天在写一个WPF控件时用到了Popup控件,很郁闷的情况是:当popup关闭时,原来被popup挡住的界面部分不刷新,非要手动刷新一下(比 ...
- 创建 WPF 工具箱控件
创建 WPF 工具箱控件 WPF (Windows Presentation Framework) 工具箱控件模板允许您创建 WPF 控件,会自动添加到 工具箱 安装扩展的安装. 本主题演示如何使用模 ...
- [习题]日历(Calendar)控件的障眼法(.Visible属性),使用时才出现?不用就消失?
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/02/calendar_icon_visible.aspx [习题]日历(Cal ...
- wpf打印控件 实现分页打印控件功能
因为 要实现打印 wpf listbox控件 数据特别多 要打印在 几张纸上 找了几天 都没有找到相关的例子 现在 解决了 在这里和大家分享一下 public void print(Fram ...
- asp.net 弹出式日历控件 选择日期 Calendar控件
原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...
- WPF 分页控件 WPF 多线程 BackgroundWorker
WPF 分页控件 WPF 多线程 BackgroundWorker 大家好,好久没有发表一篇像样的博客了,最近的开发实在头疼,很多东西无从下口,需求没完没了,更要命的是公司的开发从来不走正规流程啊, ...
- WPF Image控件中的ImageSource与Bitmap的互相转换
原文:WPF Image控件中的ImageSource与Bitmap的互相转换 1.从bitmap转换成ImageSource [DllImport("gdi32.dll", ...
- ASP.NET Calendar 控件
ASP.NET Calendar 控件 http://www.w3school.com.cn/aspnet/control_calendar.asp
随机推荐
- [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)
source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...
- 灰度图像的自动阈值分割(Otsu 法)(转载)
灰度图像的自动阈值分割(Otsu 法) 机器视觉领域许多算法都要求先对图像进行二值化.这种二值化操作阈值的选取非常重要.阈值选取的不合适,可能得到的结果就毫无用处.今天就来讲讲一种自动计算阈值的方法. ...
- HS光流算法详解<转载>
HS 光流法详解 前言 本文较为详细地介绍了一种经典的光流法 - HS 光流法. 光流法简介 当人的眼睛与被观察物体发生相对运动时,物体的影像在视网膜平面上形成一系列连续变化的图像,这一系列变化的图像 ...
- POJ 1502 MPI Maelstrom
MPI Maelstrom Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) Total ...
- 论XCODE工程里使用的宏定义.
在XCODE开发过程中,经常会遇到引用头文件,引用库路径的问题,如果不是直接的源码引入,则需要在工程中增加设置.虽然现在有了Pod这类集合管理工具,但有时为了一个很小的lib引入Pod这尊大神还是有点 ...
- Codeforces Round #127 (Div. 2)
A. LLPS 长度最大10,暴力枚举即可. B. Brand New Easy Problem 枚举\(n\)的全排列,按题意求最小的\(x\),即逆序对个数. C. Clear Symmetry ...
- hihoCoder #1033 : 交错和 (数位Dp)
题目大意: 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - ...
- C#实现图片文件到数据流再到图片文件的转换 --转
/----引入必要的命名空间 using System.IO; using System.Drawing.Imaging; //----代码部分----// private byte[] photo; ...
- JSON 序列化和反序列化——JavaScriptSerializer实现
一. JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.您无法访问序列化程序的此实例.但是,此类公开了公共 API.因此, ...
- Spring3.1新属性管理API:PropertySource、Environment、Profile
Spring3.1提供了新的属性管理API,而且功能非常强大且很完善,对于一些属性配置信息都应该使用新的API来管理.虽然现在Spring已经到4版本了,这篇文章来的晚点. 新的属性管理API Pro ...