Control
Object->DispatcherObject->DependencyObject->Visual->UIElement->FrameworkElement->Control
表示用户界面 (UI) 元素的基类,这些元素使用 ControlTemplate 来定义其外观。
Control类是添加到应用程序中的许多控件的基类。 Control类定义极少的行为; 虽然可将添加 Control 到应用程序,但添加从 Control 继承的控件(如 Button 或ListBox )更常见。
Template属性(即 ControlTemplate )指定 Control 的外观。 如果要更改控件的外观,但保留其功能,则应考虑创建一个新的 ControlTemplate ,而不是创建新类。 有关详细信息,请参阅 样式设置和模板化。
如果要创建具有自定义行为的控件并允许其他人自定义其外观,则控件可以从 Control 类继承并定义 ControlTemplate 。 如果要扩展现有控件的行为,可以从继承自的类继承 Control 。
如果一个 Control无ControlTemplate,那么它在应用程序中是不可见的,设置以下属性不起作用,除非 ControlTemplate 显式引用它们:
- Background
- BorderBrush
- BorderThickness
- FontFamily
- FontSize
- FontStretch
- FontWeight
- Foreground
- HorizontalContentAlignment
- VerticalContentAlignment
使用这些属性的常用方法是将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 |
返回 Control 对象的字符串表示形式。 | public |
名称 | 备注 |
---|---|
在双击或多次单击鼠标按钮时发生。 | |
在用户单击鼠标按钮两次或更多次时发生。 |
Calendar
代表一个控件,此控件允许用户使用可视的日历显示来选择日期。
Calendar控件可以单独使用,也可以作为DatePicker 控件的下拉部分使用 。 有关详细信息,请参阅 DatePicker。
Calendar仅支持公历。
下表提供了有关与Calendar 相关联的任务的信息 。
任务 | 实现 |
---|---|
使 Calendar 显示月份、整年或十年。 | 将 DisplayMode 属性设置为月份、年份或十年。 |
指定用户是否可以选择日期、日期范围或多个日期范围。 | 使用 SelectionMode。 |
指定不能选择的日期。 | 使用 BlackoutDates 属性。 |
指定显示的日期范围 Calendar 。 | 使用 DisplayDateStart 和 DisplayDateEnd 属性。 |
指定是否突出显示当前日期。 | 使用 IsTodayHighlighted 属性。 默认情况下, IsTodayHighlighted 为 true 。 |
更改的大小 Calendar 。 | 使用 Viewbox 或将属性设置 LayoutTransform 为 ScaleTransform 。 请注意,如果您设置的 Width 和 Height 属性 Calendar ,则实际日历不会更改其大小。 |
Calendar控件使用鼠标或键盘提供基本导航。 下表总结了键盘导航。
键组合 | DisplayMode | 操作 |
---|---|---|
箭头 | Month | SelectedDate如果 SelectionMode 属性未设置为,则更改属性 None 。 |
箭头 | Year | 更改属性的月份 DisplayDate 。 请注意,不 SelectedDate 会更改。 |
箭头 | Decade | 更改的年份 DisplayDate 。 请注意,不 SelectedDate 会更改。 |
SHIFT + 箭头 | Month | 如果 SelectionMode 未设置为 SingleDate 或 None ,则扩展选定日期的范围。 |
Home | Month | 将更改 SelectedDate 为当月的第一天。 |
Home | Year | 将的月份更改为一年中的 DisplayDate 第一个月。 不 SelectedDate 会更改。 |
Home | Decade | 将的年更改 DisplayDate 为十年的第一年。 不 SelectedDate 会更改。 |
End | Month | 将更改 SelectedDate 为当前月份的最后一天。 |
End | Year | 将中的月更改 DisplayDate 为一年中的最后一个月。 不 SelectedDate 会更改。 |
End | Decade | 将的年更改 DisplayDate 为十年的最后一年。 不 SelectedDate 会更改。 |
CTRL + 向上箭头 | 任意 | 切换到下一个更大的 DisplayMode 。 如果 DisplayMode 已存在 Decade ,则不执行任何操作。 |
CTRL + 向下箭头 | 任意 | 切换到下一个较小的 DisplayMode 。 如果 DisplayMode 已存在 Month ,则不执行任何操作。 |
空格键或 ENTER | Year 或 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 对象关联的 CalendarButton。 | get; set; |
CalendarDayButtonStyle | 获取或设置与控件的内部 Style 对象关联的 CalendarDayButton。 | get; set; |
CalendarItemStyle | 获取或设置与控件的内部 Style 对象关联的 CalendarItem。 | get; 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; |
名称 | 备注 | 权限 |
---|---|---|
当应用新模板时生成 Calendar 控件的可视化树。 | public | |
返回 CalendarAutomationPeer 供 Silverlight 自动化基础结构使用的。 | protected | |
引发 DisplayDateChanged 事件。 | protected | |
引发 DisplayModeChanged 事件。 | protected | |
为在此控件有焦点的情况下用户按任意键时发生的 KeyDown 路由事件提供类处理。 | protected | |
为在此控件有焦点的情况下用户释放任意键时发生的 KeyUp 路由事件提供类处理。 | protected | |
引发 SelectedDatesChanged 路由事件。 | protected | |
引发 SelectionModeChanged 事件。 | protected | |
提供选定日期的文本表示形式。 | public |
名称 | 备注 |
---|---|
当 DisplayDate 属性更改时发生。 | |
当 DisplayMode 属性更改时发生。 | |
在更改由 SelectedDates 属性返回的集合时发生。 | |
当 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());
}
}
}