WPF--Calendar控件高级使用

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

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

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

完整的例子:

下载连接

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

时间: 2024-10-11 01:05:32

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

WPF常用控件总结及其应用demo

WPF常用控件总结及其应用 一.控件 1.WrapPanel布局控件:可以实现当空间不足时子控件自动往下一行布局,空间充足时又会自动调整行布局.常用布局控件还有StackPanel(设置其子元素是垂直排列还是水平排列).Grid(通过定义行和列来绘制出一个表格).Canvas(通过指定相对于其的坐标来指定子控件的位置).DockPanel(设置其子元素如何停靠,DockPanel.Left.DockPanel.Right.DockPanel.Top.DockPanel.Bottom). 2.Sc

WPF- 关于自定义Calendar控件

由于项目对更改日期 时间的需要,接触了一下Calendar控件.结果发现在这么强大的控件的背后,微软其实并没有为开发人员留有很强的扩展性. (项目要求的Calendar控件能对一些特定的日期进行特殊处理,如高亮,以及类似于Outlook的Calendar一样,可以编辑会议,提醒什么的.) Calendar里有一些控件如:CalendarItem,CalendarButton,CalendarDayButton.这些控件都被定义成了sealed.所以当我们要对Calendar控件做一些自定义的时候

wpf 修改控件Background

以TextBox 控件为例 一  Brushes.颜色 textBoxName.Background = Brushes.Blue; 二 背景色值#FFD2D2D2 1 .textBoxName.Background=new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFD2D2D2")); 2.textBoxName.Background = new SolidColorBrush(Colors.White);

WPF获取控件内部的ScrollViewer,并控制ScrollViewer操作

//获取内部  ScrollViewer方法 public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject        {            if (obj != null)            {                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)          

WPF 布局控件 之 DockPanel

DockPanel为容器控件 主要了解其Dock属性和LastChildFill属性的使用 一.LastChildFill="True" 时 代码: <DockPanel LastChildFill="True"> <Button DockPanel.Dock="Top">Top</Button> <Button DockPanel.Dock="Bottom">Bottom<

WPF条形码控件支持大多数流行的一维和二维条形码Barcode Professional

Barcode Professional for WPF是一款轻量级的 .NET 程序集,为你的WPF程序生成高质量的基于矢量的条码控件,支持大多数流行的一维和二维条形码:Code 39, Code 128, GS1-128, GS1 DataBar (RSS-14),  EAN 13 & UPC, Postal (USPS, British Royal Mail, Australia Post, DHL, etc.), Data Matrix, QR Code, PDF 417, UPS Ma

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

WPF Popup 控件导致被遮挡内容不刷新的原因 周银辉 今天在写一个WPF控件时用到了Popup控件,很郁闷的情况是:当popup关闭时,原来被popup挡住的界面部分不刷新,非要手动刷新一下(比如最大最小化一下窗口),就连网上传说的这个方法也不行 ? 1 2 3 4 5 6 7 8 9 10 public static class UiHelper {     private delegate void NoArgDelegate();     public static void Ref

WPF布局控件常用属性介绍

WPF布局控件常用属性介绍 其它 | 作者:慧都控件网 | 2011-04-06 13:41:57| 阅读 0次 有用(0) 评论(0) 概述:WPF布局控件都是派生自System.Windows.Controls.Panel抽象类的面板,Panel类继承自 FrameworkElement,Panel类本身并没有什么特别的,但是WPF中提供了许多用于布局的控件都继承自Panel类,如 StackPanel控件,WrapPanel,DockPanel,Grid,UniformGrid,Canva

wpf 保存控件中的内容为图片格式

黄色的是wpf控件的名称! //保存到特定路径            FileStream fs = new FileStream(@"C:\image.png", FileMode.Create);            //对象转换成位图            RenderTargetBitmap bmp = new RenderTargetBitmap((int)this.mediaElement1.ActualWidth, (int)this.mediaElement1.Act