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
随机推荐
- OpenFlow Switch学习笔记(七)——Matching Fields
Matching Fields in_port=port Matches OpenFlow port port dl_vlan=vlan Matches IEEE 802.1q Virtual LAN ...
- GFF format
后记: ************************************************************************ 在使用cufflinks和cuffmerge中 ...
- iOS学习笔记---oc语言第三天
继承.初始化方法 一.继承 继承的上层:父类 继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量 ...
- 修饰符(static、final、abstract)第二篇
二.Final 核心:一旦创建,不可修改 可修饰:(创建即终态) 1.类:被修饰后,将不能被继承 2.方法:被修饰后,将不能被覆写 3.属性:被创建,不可修改,且必须赋值(赋值的两种形式): 1.直接 ...
- 字符串p型编码
总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串12234411 ...
- poj3687 拓扑序
题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...
- UVA10305 拓扑序
题意:给出多个任务,以及一系列任务的关系表示某个任务必须在某个任务前完成,问一个合理的任务完成顺序 拓扑序的裸题,一开始用大白书的写法,后来发现并不好用,就换了BFS又A了一遍. 原: #includ ...
- Amazon-countDuplicate
Print the count of duplicate char in a given string in same order. Ex: Input- 'abbaccdbac', Output- ...
- 两种不同的Context
本文转载于:http://blog.csdn.net/xiaodongvtion/article/details/8443772 这是两种不同的context,也是最常见的两种.第一种中context ...
- java编程之:Unsafe类
Unsafe类在jdk 源码的多个类中用到,这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率.但是,它是一把双刃剑:正如它的名字所预示的那样,它是 Unsafe的,它所分配的内存需要 ...