UI⑥Control族控件Calendar

 

Control

Object->DispatcherObject->DependencyObject->Visual->UIElement->FrameworkElement->Control

表示用户界面 (UI) 元素的基类,这些元素使用 ControlTemplate 来定义其外观。

Control类是添加到应用程序中的许多控件的基类。 Control类定义极少的行为; 虽然可将添加 Control 到应用程序,但添加从 Control 继承的控件(如 Button 或ListBox )更常见。

Template属性(即 ControlTemplate )指定 Control 的外观。 如果要更改控件的外观,但保留其功能,则应考虑创建一个新的 ControlTemplate ,而不是创建新类。 有关详细信息,请参阅 样式设置和模板化

如果要创建具有自定义行为的控件并允许其他人自定义其外观,则控件可以从 Control 类继承并定义 ControlTemplate 。 如果要扩展现有控件的行为,可以从继承自的类继承 Control 。

如果一个 ControlControlTemplate,那么它在应用程序中是不可见的,设置以下属性不起作用,除非 ControlTemplate 显式引用它们:

使用这些属性的常用方法是将ControlTemplate 中的元素绑定到属性。 例如,如果希望控件根据Background 属性的值更改颜色,可以将ControlTemplate 中元素的某些属性绑定到 Background 。 使用 TemplateBinding 标记扩展 将控件的属性绑定到ControlTemplate 中的元素 。

Control 重写Focusable 属性的元数据 ,并将其默认设置为 true 。 有关详细信息,请参阅 依赖项属性概述

名称备注权限
BackgroundProperty标识 Background 依赖项属性。public static readonly
BorderBrushProperty标识 BorderBrush 依赖项属性。public static readonly
BorderThicknessProperty标识 BorderThickness 依赖项属性。public static readonly
FontFamilyProperty标识 FontFamily 依赖项属性。public static readonly
FontSizeProperty标识 FontSize 依赖项属性。public static readonly
FontStretchProperty标识 FontStretch 依赖项属性。public static readonly
FontStyleProperty标识 FontStyle 依赖项属性。public static readonly
FontWeightProperty标识 FontWeight 依赖项属性。public static readonly
ForegroundProperty标识 Foreground 依赖项属性。public static readonly
HorizontalContentAlignmentProperty标识 HorizontalContentAlignment 依赖项属性。public static readonly
IsTabStopProperty标识 IsTabStop 依赖项属性。public static readonly
MouseDoubleClickEvent标识 MouseDoubleClick 路由事件。public static readonly
PaddingProperty标识 Padding 依赖项属性。public static readonly
PreviewMouseDoubleClickEvent标识 PreviewMouseDoubleClick 路由事件。public static readonly
TabIndexProperty标识 TabIndex 依赖项属性。public static readonly
TemplateProperty标识 Template 依赖项属性。public static readonly
VerticalContentAlignmentProperty标识 VerticalContentAlignment 依赖项属性。public static readonly
名称备注权限
Background获取或设置一个用于描述控件背景的画笔。get; set;
BorderBrush获取或设置一个用于描述控件的边框背景的画笔。get; set;
BorderThickness获取或设置控件的边框宽度。get; set;
FontFamily获取或设置控件的字体系列。get; set;
FontSize获取或设置字号。get; set;
FontStretch获取或设置字体在屏幕上紧缩或加宽的程度。get; set;
FontStyle获取或设置字体样式。get; set;
FontWeight获取或设置指定字体的粗细。get; set;
Foreground获取或设置一个用于描述前景色的画笔。get; set;
HandlesScrolling获取一个值,该值指示控件是否支持滚动。get;
HorizontalContentAlignment获取或设置控件内容的水平对齐方式。get; set;
IsTabStop获取或设置一个值,该值指示是否将某个控件包含在 Tab 导航中。get; set;
Padding获取或设置控件内部的填充边距。get; set;
TabIndex获取或设置一个值,该值决定在用户使用 Tab 键在控件中导航时元素接收焦点的顺序。get; set;
Template获取或设置控件模板。get; set;
VerticalContentAlignment获取或设置控件内容的垂直对齐方式。get; set;
名称备注权限
ArrangeOverride调用以排列 Control 对象的内容并调整其大小。protected
MeasureOverride调用以重新测量控件。protected
OnMouseDoubleClick引发 MouseDoubleClick 路由事件。protected
OnPreviewMouseDoubleClick引发 PreviewMouseDoubleClick 路由事件。protected
OnTemplateChanged在控件模板发生更改时调用。protected

ToString

返回 Control 对象的字符串表示形式。public
名称备注

MouseDoubleClick

在双击或多次单击鼠标按钮时发生。

PreviewMouseDoubleClick

在用户单击鼠标按钮两次或更多次时发生。

Calendar

代表一个控件,此控件允许用户使用可视的日历显示来选择日期。

Calendar控件可以单独使用,也可以作为DatePicker 控件的下拉部分使用 。 有关详细信息,请参阅 DatePicker

Calendar仅支持公历。

下表提供了有关与Calendar 相关联的任务的信息 。

注解
任务实现
使 Calendar 显示月份、整年或十年。将 DisplayMode 属性设置为月份、年份或十年。
指定用户是否可以选择日期、日期范围或多个日期范围。使用 SelectionMode
指定不能选择的日期。使用 BlackoutDates 属性。
指定显示的日期范围 Calendar 。使用 DisplayDateStart 和 DisplayDateEnd 属性。
指定是否突出显示当前日期。使用 IsTodayHighlighted 属性。 默认情况下, IsTodayHighlighted 为 true 。
更改的大小 Calendar 。使用 Viewbox 或将属性设置 LayoutTransform 为 ScaleTransform 。 请注意,如果您设置的 Width 和 Height 属性 Calendar ,则实际日历不会更改其大小。

Calendar控件使用鼠标或键盘提供基本导航。 下表总结了键盘导航。

表 2
键组合DisplayMode操作
箭头MonthSelectedDate如果 SelectionMode 属性未设置为,则更改属性 None 。
箭头Year更改属性的月份 DisplayDate 。 请注意,不 SelectedDate 会更改。
箭头Decade更改的年份 DisplayDate 。 请注意,不 SelectedDate 会更改。
SHIFT + 箭头Month如果 SelectionMode 未设置为 SingleDate 或 None ,则扩展选定日期的范围。
HomeMonth将更改 SelectedDate 为当月的第一天。
HomeYear将的月份更改为一年中的 DisplayDate 第一个月。 不 SelectedDate 会更改。
HomeDecade将的年更改 DisplayDate 为十年的第一年。 不 SelectedDate 会更改。
EndMonth将更改 SelectedDate 为当前月份的最后一天。
EndYear将中的月更改 DisplayDate 为一年中的最后一个月。 不 SelectedDate 会更改。
EndDecade将的年更改 DisplayDate 为十年的最后一年。 不 SelectedDate 会更改。
CTRL + 向上箭头任意切换到下一个更大的 DisplayMode 。 如果 DisplayMode 已存在 Decade ,则不执行任何操作。
CTRL + 向下箭头任意切换到下一个较小的 DisplayMode 。 如果 DisplayMode 已存在 Month ,则不执行任何操作。
空格键或 ENTERYear 或 Decade切换 DisplayMode 到 Month 或 Year 由重点项表示。

自定义日历控件

若要对多个 Calendar 控件应用相同的属性设置,请使用 Style 属性。 您可以修改默认值 ControlTemplate ,为控件指定独特的外观。 有关创建 ControlTemplate 的详细信息,请参阅 通过创建 System.windows.controls.controltemplate> 自定义现有控件的外观。 若要查看特定于 Calendar 的部分和状态,请参阅 日历样式和模板

此控件的依赖属性可能由控件的默认样式设置。 如果按默认样式设置属性,则当控件出现在应用程序中时,属性可能会更改为默认值。 默认样式取决于应用程序运行时使用的桌面主题。 有关详细信息,请参阅 默认的 WPF 主题

Note

设置视觉属性仅在该属性同时存在于控件的默认模板中并且通过使用TemplateBinding进行设置时才有效。您可以在通过创建ControlTemplate定制现有控件的外观的更改控件的视觉结构”部分中找到视觉属性列表。

XAML 对象元素用法

<Calendar .../>  
名称备注权限
CalendarButtonStyleProperty标识 CalendarButtonStyle 依赖项属性。public static readonly
CalendarDayButtonStyleProperty标识 CalendarDayButtonStyle 依赖项属性。public static readonly
CalendarItemStyleProperty标识 CalendarItemStyle 依赖项属性。public static readonly
DisplayDateEndProperty标识 DisplayDateEnd 依赖项属性。public static readonly
DisplayDateProperty标识 DisplayDate 依赖项属性。public static readonly
DisplayDateStartProperty标识 DisplayDateStart 依赖项属性。public static readonly
DisplayModeProperty标识 DisplayMode 依赖项属性。public static readonly
FirstDayOfWeekProperty标识 FirstDayOfWeek 依赖项属性。public static readonly
IsTodayHighlightedProperty标识 IsTodayHighlighted 依赖项属性。public static readonly
SelectedDateProperty标识 SelectedDate 依赖项属性。public static readonly
SelectedDatesChangedEvent标识 SelectedDatesChanged 路由事件。public static readonly
SelectionModeProperty标识 SelectionMode 依赖项属性。public static readonly
名称备注权限
BlackoutDates获取标记为不可选择的日期的集合。get; 
CalendarButtonStyle获取或设置与控件的内部 Style 对象关联的 CalendarButtonget; set;
CalendarDayButtonStyle获取或设置与控件的内部 Style 对象关联的 CalendarDayButtonget; set;
CalendarItemStyle获取或设置与控件的内部 Style 对象关联的 CalendarItemget; set;
DisplayDate获取或设置要显示的日期。get; set;
DisplayDateEnd获取或设置日历中可用日期范围内的最后一个日期。get; set;
DisplayDateStart获取或设置日历中第一个可用的日期。get; set;
DisplayMode获取或设置一个值,该值指示日历是显示月份、年份还是十年期。get; set;
FirstDayOfWeek获取或设置被视为一周开始的日期。get; set;
IsTodayHighlighted获取或设置一个值,该值指示是否将突出显示当前日期。get; set;
SelectedDate获取或设置当前选定的日期。get; set;
SelectedDates获取选定日期的集合。get; 
SelectionMode获取或设置一个值,该值指示允许哪种类型的选择。get; set;
名称备注权限

OnApplyTemplate

当应用新模板时生成 Calendar 控件的可视化树。public

OnCreateAutomationPeer

返回 CalendarAutomationPeer 供 Silverlight 自动化基础结构使用的。protected

OnDisplayDateChanged

引发 DisplayDateChanged 事件。protected

OnDisplayModeChanged

引发 DisplayModeChanged 事件。protected

OnKeyDown

为在此控件有焦点的情况下用户按任意键时发生的 KeyDown 路由事件提供类处理。protected

OnKeyUp

为在此控件有焦点的情况下用户释放任意键时发生的 KeyUp 路由事件提供类处理。protected

OnSelectedDatesChanged

引发 SelectedDatesChanged 路由事件。protected

OnSelectionModeChanged

引发 SelectionModeChanged 事件。protected

ToString

提供选定日期的文本表示形式。public
名称备注

DisplayDateChanged

当 DisplayDate 属性更改时发生。

DisplayModeChanged

当 DisplayMode 属性更改时发生。

SelectedDatesChanged

在更改由 SelectedDates 属性返回的集合时发生。

SelectionModeChanged

当 SelectionMode 更改时发生。

  • IsTodayHighlighted

  • BlackoutDates

  • SelectedDates

  • DisplayDateStart

  • DisplayDateEnd

  • DisplayDate

  • FirstDayOfWeek

 


XAML范例

<Window
    x:Class="CalendarDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:CalendarDemo"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow"
    Width="300"
    Height="300"
    mc:Ignorable="d">
    <StackPanel>
        <Calendar
            Margin="10,10,10,10"
            DisplayDate="5/2/2021"
            DisplayDateChanged="OnDisplayDateChanged"
            DisplayDateEnd="12/1/2021"
            DisplayDateStart="1/1/2021"
            DisplayMode="Month"
            DisplayModeChanged="OnDisplayModeChanged"
            FirstDayOfWeek="Monday"
            IsTodayHighlighted="True"
            SelectedDatesChanged="OnSelectedDatesChanged"
            SelectionMode="MultipleRange"
            SelectionModeChanged="OnSelectionModeChanged">
            <Calendar.BlackoutDates>
                <CalendarDateRange End="5/23/2021" Start="5/20/2021" />
                <CalendarDateRange End="5/29/2021" Start="5/26/2021" />
            </Calendar.BlackoutDates>
            <Calendar.SelectedDates>
                <sys:DateTime>5/5/2021</sys:DateTime>
                <sys:DateTime>5/12/2021</sys:DateTime>
                <sys:DateTime>5/14/2021</sys:DateTime>
                <sys:DateTime>5/15/2021</sys:DateTime>
            </Calendar.SelectedDates>
        </Calendar>
        <Button Click="OnSelectionMode" Content="更改SelectionMode" />
        <Button Click="OnDisplayMode" Content="更改DisplayMode" />
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace CalendarDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnSelectionMode(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if(item is Calendar)
                {
                    bool next = false;
                    foreach (var s in Enum.GetNames(typeof(CalendarSelectionMode)))
                    {
                        if (next == true)
                        {
                            (item as Calendar).SelectionMode= (CalendarSelectionMode)Enum.Parse(typeof(CalendarSelectionMode), s);
                            return;
                        }
                        if (s == Enum.GetName(typeof(CalendarSelectionMode),(item as Calendar).SelectionMode)) 
                            next = true;
                    }
                    foreach (var s in Enum.GetNames(typeof(CalendarSelectionMode)))
                    {
                        (item as Calendar).SelectionMode = (CalendarSelectionMode)Enum.Parse(typeof(CalendarSelectionMode), s);
                        return;
                    }                    
                }
            }
        }

        private void OnDisplayMode(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if (item is Calendar)
                {
                    bool next = false;
                    foreach (var s in Enum.GetNames(typeof(CalendarMode)))
                    {
                        if (next == true)
                        {
                            (item as Calendar).DisplayMode = (CalendarMode)Enum.Parse(typeof(CalendarMode), s);
                            return;
                        }
                        if (s == Enum.GetName(typeof(CalendarMode), (item as Calendar).DisplayMode))
                            next = true;
                    }
                    foreach (var s in Enum.GetNames(typeof(CalendarMode)))
                    {
                        (item as Calendar).DisplayMode = (CalendarMode)Enum.Parse(typeof(CalendarMode), s);
                        return;
                    }
                }
            }
        }

        private void OnDisplayDateChanged(object sender, CalendarDateChangedEventArgs e)
        {
            if (sender is Calendar && this.IsLoaded == true)  MessageBox.Show("OnDisplayDateChanged");
        }

        private void OnDisplayModeChanged(object sender, CalendarModeChangedEventArgs e)
        {
            if (sender is Calendar && this.IsLoaded == true)  MessageBox.Show("OnDisplayModeChanged");
        }

        private void OnSelectedDatesChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is Calendar && this.IsLoaded==true)
            {
                string s = String.Empty;
                foreach (var item in (sender as Calendar).SelectedDates)
                {
                    s += item + "、";
                    MessageBox.Show("OnSelectionModeChanged\n+SelectedDates:" + s);
                }
            }          
        }

        private void OnSelectionModeChanged(object sender, EventArgs e)
        {
                if (sender is Calendar && this.IsLoaded == true)    MessageBox.Show("OnSelectionModeChanged\n+SelectionMode:"+ (sender as Calendar).SelectionMode.ToString());             
        }
    }
}

C#范例

<Window
    x:Class="CalendarDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:CalendarDemo"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow"
    Width="300"
    Height="300"
    mc:Ignorable="d">
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace CalendarDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Calendar calendar = new Calendar { Margin = new Thickness(10, 10, 10, 10),
                DisplayDate = new DateTime(2021, 5, 2),
                DisplayDateStart = new DateTime(2021, 1, 1),
                DisplayDateEnd = new DateTime(2021, 12, 1),
                DisplayMode = CalendarMode.Month,
                FirstDayOfWeek = DayOfWeek.Monday,
                IsTodayHighlighted=true,
                SelectionMode=CalendarSelectionMode.MultipleRange
            };
            calendar.DisplayDateChanged += OnDisplayDateChanged;
            calendar.DisplayModeChanged += OnDisplayModeChanged;
            calendar.SelectedDatesChanged += OnSelectedDatesChanged;
            calendar.SelectionModeChanged += OnSelectionModeChanged;
            CalendarDateRange calendarDateRange0 = new CalendarDateRange {Start= new DateTime(2021, 5, 20),End= new DateTime(2021, 5, 23) };
            CalendarDateRange calendarDateRange1 = new CalendarDateRange { Start = new DateTime(2021, 5, 26), End = new DateTime(2021, 5, 29) };
            calendar.BlackoutDates.Add(calendarDateRange0);
            calendar.BlackoutDates.Add(calendarDateRange1);
            calendar.SelectedDates.Add(new DateTime(2021, 5, 5));
            calendar.SelectedDates.Add(new DateTime(2021, 5, 12));
            calendar.SelectedDates.Add(new DateTime(2021, 5, 14));
            calendar.SelectedDates.Add(new DateTime(2021, 5, 15));

            Button button0 = new Button { Content = "更改SelectionMode"  };
            button0.Click += OnSelectionMode;
            Button button1 = new Button { Content = "更改DisplayMode" };
            button1.Click += OnDisplayMode;

            StackPanel stackPanel = new StackPanel();
            stackPanel.Children.Add(calendar);
            stackPanel.Children.Add(button0);
            stackPanel.Children.Add(button1);

            this.Content = stackPanel;
        }

        private void OnSelectionMode(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if(item is Calendar)
                {
                    bool next = false;
                    foreach (var s in Enum.GetNames(typeof(CalendarSelectionMode)))
                    {
                        if (next == true)
                        {
                            (item as Calendar).SelectionMode= (CalendarSelectionMode)Enum.Parse(typeof(CalendarSelectionMode), s);
                            return;
                        }
                        if (s == Enum.GetName(typeof(CalendarSelectionMode),(item as Calendar).SelectionMode)) 
                            next = true;
                    }
                    foreach (var s in Enum.GetNames(typeof(CalendarSelectionMode)))
                    {
                        (item as Calendar).SelectionMode = (CalendarSelectionMode)Enum.Parse(typeof(CalendarSelectionMode), s);
                        return;
                    }                    
                }
            }
        }

        private void OnDisplayMode(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if (item is Calendar)
                {
                    bool next = false;
                    foreach (var s in Enum.GetNames(typeof(CalendarMode)))
                    {
                        if (next == true)
                        {
                            (item as Calendar).DisplayMode = (CalendarMode)Enum.Parse(typeof(CalendarMode), s);
                            return;
                        }
                        if (s == Enum.GetName(typeof(CalendarMode), (item as Calendar).DisplayMode))
                            next = true;
                    }
                    foreach (var s in Enum.GetNames(typeof(CalendarMode)))
                    {
                        (item as Calendar).DisplayMode = (CalendarMode)Enum.Parse(typeof(CalendarMode), s);
                        return;
                    }
                }
            }
        }

        private void OnDisplayDateChanged(object sender, CalendarDateChangedEventArgs e)
        {
            if (sender is Calendar && this.IsLoaded == true)  MessageBox.Show("OnDisplayDateChanged");
        }

        private void OnDisplayModeChanged(object sender, CalendarModeChangedEventArgs e)
        {
            if (sender is Calendar && this.IsLoaded == true)  MessageBox.Show("OnDisplayModeChanged");
        }

        private void OnSelectedDatesChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is Calendar && this.IsLoaded==true)
            {
                string s = String.Empty;
                foreach (var item in (sender as Calendar).SelectedDates)
                {
                    s += item + "、";
                    MessageBox.Show("OnSelectionModeChanged\n+SelectedDates:" + s);
                }
            }          
        }

        private void OnSelectionModeChanged(object sender, EventArgs e)
        {
                if (sender is Calendar && this.IsLoaded == true)    MessageBox.Show("OnSelectionModeChanged\n+SelectionMode:"+ (sender as Calendar).SelectionMode.ToString());             
        }
    }
}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值