WPF DatePicker与Calendar的使用和样式修改

什么是DatePicker,Calendar

  • Calendar:日历(显示年月日视图控件)
  • DatePicker:日期选择器(是一个更小的控件,点击控件时才会弹出一个日历)

Calendar使用

常用属性
  • DisplayMode:显示日历时最高的一级,以十年、年、月来显示,一般用Month
  • DisplayDateStart:日历的开始日期
  • DisplayDateEnd:日历的结束日期
  • DisplayDate:显示开始月份和日期
  • SelectedDate:选择的日期
  • FirstDayOfWeek:某一天作为日历第一列的第一天(FirstDayOfWeek="Monday")
  • IsTodayHighlighted:设置今日是否高亮显示("True"为高亮显示)
  • SelectionMode:日期选择范围("MultipleRange"为可选择多个日期范围)
常用事件
  • SelectedDatesChanged:当选择的日期发生改变时
private void Calender_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{//SelectionMode="SingleDate"this.Title = Calender.SelectedDate.ToString();//SelectionMode="MultipleRange"/*for (int i = 0; i < Calender.SelectedDates.Count; i++){this.s += this.Calender.SelectedDates[i].ToString();this.Title = this.s;}*/
}
日期限制

        根据您使用 Calendar 控件的目的,您可能希望日期不能被选中且颜色变淡,可使用BlackoutDates集合添加限定日期范围。

<Calendar x:Name="calendar" Height="170" Width="200" <Calendar.BlackoutDates><CalendarDateRange Start="01.01.2024" End="01.03.2024" /><CalendarDateRange Start="01.06.2024" End="01.09.2024" /></Calendar.BlackoutDates>
</Calendar>

DatePicker使用

常用属性
  • IsDropDownOpen:日历视图是否一开始就展开(“True”为一开始就展开)
常用事件
  • DateValidationError:用户输入非法的日期时触发
private void DatePicker_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
{MessageBox.Show($"输入非法日期:{e.Text},错误原因是:{e.Exception.Message}"); 
}

Calendar样式修改

Calendar的主要样式
  • CalendarStyle:日历框架样式
  • CalendarButtonStyle:日历面板样式
  • CalendarDayButtonStyle:天的样式
  • CalendarItemStyle:月份样式

<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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:CalendarDemo"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Window.Resources><!--日历样式--><Style x:Key="DefaultCalendar" TargetType="{x:Type Calendar}"><Setter Property="SnapsToDevicePixels" Value="True" /><!--日历背景色--><Setter Property="Background" Value="#FF76AEE4"/><!--日历边框颜色--><Setter Property="BorderBrush" Value="#FFA31ECC"/><!--日历边框线条宽度--><Setter Property="BorderThickness" Value="2" /><!--日历字体样式--><Setter Property="FontFamily" Value="Arial" /><!--今日是否高亮--><Setter Property="IsTodayHighlighted" Value="True" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type Calendar}"><CalendarItem x:Name="PART_CalendarItem" BorderBrush="{TemplateBinding BorderBrush}" FontFamily="{TemplateBinding FontFamily}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"/></ControlTemplate></Setter.Value></Setter></Style></Window.Resources><Grid><!--使用ViewBox可以让日历试图大小跟随窗体大小一起改变--><Viewbox   VerticalAlignment="Center" HorizontalAlignment="Center" ><Calendar   Style="{DynamicResource DefaultCalendar}"Margin="150 0 150 0"Height="170"Width="200"FontSize="20" /></Viewbox></Grid>
</Window>

自定义DatePicker控件

        通过自定义的DatePicker控件可显示日期和时间,代码有详细注释,方便移植到项目。

<UserControl x:Class="CalendarDemo.DateTimePicker"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:CalendarDemo"mc:Ignorable="d" Name="own"d:DesignHeight="25" d:DesignWidth="200" GotFocus="own_GotFocus" LostFocus="own_LostFocus" ><UserControl.Resources><!--日期时间 下拉框样式--><ControlTemplate x:Key="ComboBoxToggleTimeButton" TargetType="{x:Type ToggleButton}"><Grid ><Border Grid.Column="1" Background="White" Opacity="0"   Cursor="Hand"/><Path x:Name="Arrow" Grid.Column="0"  Visibility="Collapsed" Data="M 0 0  6 6 12 0 " Stroke="#BBBBBB" VerticalAlignment="Center" HorizontalAlignment="Right" Stretch="None" Fill="Transparent" Margin="0,10,8,9" RenderTransformOrigin="0.5,0.5"/></Grid><ControlTemplate.Triggers><Trigger Property="IsChecked" Value="true"><Setter TargetName="Arrow" Property="RenderTransform"><Setter.Value><RotateTransform Angle="180"/></Setter.Value></Setter><Setter TargetName="Arrow" Property="Margin" Value="0,10,8,9" /></Trigger></ControlTemplate.Triggers></ControlTemplate><Style x:Key="DateTimeComboBoxStyle" TargetType="{x:Type ComboBox}"><Setter Property="ItemContainerStyle"><Setter.Value><Style TargetType="{x:Type ComboBoxItem}"><Setter Property="Width" Value="30"/><Setter Property="Height" Value="22"/><Setter Property="Template"><Setter.Value><ControlTemplate  TargetType="{x:Type ComboBoxItem}"><Grid Height="{TemplateBinding Height}" Width="{TemplateBinding Width}" Background="White" Cursor="Hand"><Border x:Name="_borderbg" Background="Transparent" CornerRadius="3" Height="20"/><TextBlock  TextAlignment="Center" VerticalAlignment="Center"  x:Name="_txt" Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Content}"/><Border x:Name="_border" Background="LightBlue" Opacity="0"/></Grid><ControlTemplate.Triggers><Trigger Property="IsSelected" Value="true"><Setter TargetName="_txt" Property="Foreground" Value="#FF0318E6"/></Trigger><MultiTrigger><MultiTrigger.Conditions><Condition Property="IsMouseOver" Value="true"/></MultiTrigger.Conditions><Setter TargetName="_borderbg" Property="Background" Value="LightBlue" /></MultiTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></Setter.Value></Setter><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type ComboBox}"><Grid><Border  BorderThickness="1" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="3"/><ContentPresenter  HorizontalAlignment="Center"  x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/><!--ToggleButton 已数据绑定到 ComboBox 本身以切换 IsDropDownOpen--><ToggleButton  Template="{StaticResource ComboBoxToggleTimeButton}" x:Name="ToggleButton" Focusable="false" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/><!--必须将 TextBox 命名为 PART_EditableTextBox,否则 ComboBox 将无法识别它--><TextBox   Visibility="Hidden" BorderThickness="0"   Margin="2 0 0 0" x:Name="PART_EditableTextBox"  VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/><!--Popup 可显示 ComboBox 中的项列表。IsOpen 已数据绑定到通过 ComboBoxToggleButton 来切换的 IsDropDownOpen--><Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom"  HorizontalOffset="-6" x:Name="Popup" Focusable="False" AllowsTransparency="True"  PopupAnimation="Slide" ><Grid MaxHeight="120" MinWidth="{TemplateBinding ActualWidth}" Background="White" x:Name="DropDown" SnapsToDevicePixels="True" Width="40" ><Border x:Name="DropDownBorder"  BorderBrush="LightGray" BorderThickness="1" CornerRadius="3" Background="White"/><ScrollViewer Margin="1"  SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" CanContentScroll="True"><!--StackPanel 用于显示子级,方法是将 IsItemsHost 设置为 True--><StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" Margin="0,5" Background="{TemplateBinding Background}"/></ScrollViewer></Grid></Popup></Grid><ControlTemplate.Triggers><Trigger Property="IsEditable" Value="true"><Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible" /></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><local:BoolToVisibleConverter x:Key="boolToVisible"></local:BoolToVisibleConverter></UserControl.Resources><Grid><Border Name="_border" BorderBrush="#E6E6E6"  BorderThickness="2" Background="White"  Margin="0,0,0,0" CornerRadius="4"/><TextBlock Name="textTime"  HorizontalAlignment="Left" FontSize="{Binding DTFontSize,ElementName=own}" Foreground="{Binding DTForground,ElementName=own}"VerticalAlignment="Center"  Text="{Binding DateTimeValue,ElementName=own}" Margin="10,0,0,0"/><TextBlock Name="shuiyin" Text="选择日期与时间" Margin="10,0,0,0" FontSize="{Binding DTFontSize,ElementName=own}"  VerticalAlignment="Center" Foreground="Gray" Visibility="{Binding ElementName=textTime, Path= Text.IsEmpty,Converter={StaticResource boolToVisible}}" HorizontalAlignment="Left"/><Button Name="icon" Style="{StaticResource ButtonStyle1}"  MinWidth="15" MinHeight="15" MaxHeight="18" MaxWidth="18" Margin="0,5,5,5" Width="{Binding ActualHeight,RelativeSource={RelativeSource Self}}" HorizontalAlignment="Right"   Click="icon_Click"><Button.Background><ImageBrush ImageSource="pack://application:,,,/Assets/ic_ziyuan_date.png" ></ImageBrush></Button.Background></Button><Popup x:Name="popup" StaysOpen="False" Placement="Bottom" VerticalOffset="10" ><Border BorderBrush="#DDDDDD" BorderThickness="2" Width="200"><StackPanel Background="White" ><Viewbox ><Calendar Name="calDate" Style="{DynamicResource CalendarStyle1}" CalendarItemStyle="{DynamicResource CalendarItemStyle1 }"CalendarDayButtonStyle="{DynamicResource CalendarDayButtonStyle}"CalendarButtonStyle="{DynamicResource CalendarButtonStyle}"SelectedDatesChanged="calDate_SelectedDatesChanged" BorderBrush="{x:Null}"/></Viewbox><Grid Name="grid" Height="24" Width="{Binding ActualWidth,ElementName=own}" Margin="0,-10,0,5" Visibility="Visible" ><Grid.ColumnDefinitions><ColumnDefinition Width="25*"/><ColumnDefinition Width="94*"/><ColumnDefinition Width="40*"/></Grid.ColumnDefinitions><Border BorderBrush="#EE7942" Grid.ColumnSpan="3" BorderThickness="0,0,0,1"  Background="White" CornerRadius="0,0,4,4" Margin="1,-3" Opacity="0.8" Visibility="Visible"></Border><TextBlock Text="时间"  HorizontalAlignment="Center" VerticalAlignment="Center" /><Grid Grid.Column="1" Name="showTime" Height="22" VerticalAlignment="Center"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="3"/><ColumnDefinition/><ColumnDefinition Width="3"/><ColumnDefinition/></Grid.ColumnDefinitions><ComboBox Name="hourCbx" Grid.Column="0" HorizontalContentAlignment="Center" Style="{StaticResource DateTimeComboBoxStyle}" Foreground="Black" SelectedIndex="0" Margin="0" /><TextBlock Text=":" Foreground="Gray" Grid.Column="1" VerticalAlignment="Center" Margin="0,-3,0,0" HorizontalAlignment="Center"></TextBlock><ComboBox Name="minCbx" Grid.Column="2" HorizontalContentAlignment="Center" Style="{StaticResource DateTimeComboBoxStyle}" Foreground="Black" SelectedIndex="0" Margin="0" /><TextBlock Text=":" Foreground="Gray" Grid.Column="3" VerticalAlignment="Center" Margin="0,-3,0,0" HorizontalAlignment="Center"></TextBlock><ComboBox Name="secondCbx" HorizontalContentAlignment="Center" Grid.Column="4" Style="{StaticResource DateTimeComboBoxStyle}" Foreground="Black" SelectedIndex="0" Margin="0" /></Grid><Button Name="ok" Content="确定" Grid.Column="2"  Width="35" Height="18" VerticalAlignment="Center" HorizontalAlignment="Center"Click="ok_Click" Style="{DynamicResource ButtonStyle2}"></Button></Grid></StackPanel></Border></Popup></Grid>
</UserControl>

自定义DatePicker控件实例链接:

https://download.csdn.net/download/lvxingzhe3/88701624

参考:

基础内容: 自定义新的 WPF Calendar 控件 | Microsoft Learn

https://www.cnblogs.com/lzjsky/p/17211723.html

wpf自定义样式DatePickerStyle及Calendar控件_wpf中calendar控件美化-CSDN博客

https://www.cnblogs.com/anding/p/4979764.html

WPF 入门教程Calendar控件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/230995.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】网络层IP地址和IP数据报的格式

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

3D 纹理的综合指南

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…

打包与解包:Go 中 archive 库的实战应用

打包与解包&#xff1a;Go 中 archive 库的实战应用 引言archive 库概览支持的文件格式archive 库与其他 Go 标准库的协同 使用 archive/tar 打包与解包打包文件到 Tar 归档从 Tar 归档解包文件 使用 archive/zip 进行压缩与解压缩创建 Zip 压缩文件从 Zip 归档解压文件 总结与…

Linux第2步_创建虚拟机

VMware软件安装好后&#xff0c;就可以创建虚拟机了。 一、虚拟机对CPU的要求较高 i7 处理器&#xff1a;CPU&#xff1a;Intel(R) Core(TM) i7-8700 CPU 3.20GHz 3.19 GHz 内核数&#xff1a;6 线程数&#xff1a; 12 最大睿频频率&#xff1a; 4.60 GHz 英特尔 睿…

Visual Studio 2013 “即将退休”

新年快乐&#xff01; 这也是向各位开发者提醒 Visual Studio 支持生命周期中即将到来的好时机。 对 Visual Studio 2013 的支持即将在今年(2024年)的4月9日结束。如果你正在使用旧版本的 Visual Studio&#xff0c;我们强烈建议您升级您的开发环境到最新的 Visual Studio 20…

云尚办公项目学习

完整的笔记可以参考这个专栏&#xff0c;写的挺详细的&#xff1a;云尚办公课件笔记&#xff0c;come on boy form-create前端组件 formProps记录了表单有哪些表单项&#xff0c;分别是哪些类型&#xff08;下拉&#xff0c;单选&#xff0c;输入框&#xff09; formOptions记…

C# OpenCvSharp DNN FreeYOLO 目标检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 目标检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- Outp…

NSSCTF 简单包含

开启环境: 使用POST传flag&#xff0c;flag目录/var/www/html/flag.php 先使用post来尝试读取该flag.php 没反应: 查看一下源码index.php&#xff0c;看有什么条件 base64解密: <?php$path $_POST["flag"];if (strlen(file_get_contents(php://input)) <…

vue3-12

需求是用户如果登录了&#xff0c;可以访问主页&#xff0c;如果没有登录&#xff0c;则不能访问主页&#xff0c;随后跳转到登录界面&#xff0c;让用户登录 实现思路&#xff0c;在用户登录之前做一个检查&#xff0c;如果登录了&#xff0c;则token是存在的&#xff0c;则放…

小样本学习介绍(超详细)

小样本学习介绍 本文首先介绍了什么是小样本学习&#xff0c;其次介绍了为什么小样本学习的很多文章都采用元学习的方法。目的是通过通俗的解释更加清楚的介绍小样本学习是什么&#xff0c;适合初学者的入门。当然&#xff0c;以下更多的是自己的思考&#xff0c;欢迎交流。 …

【CISSP学习笔记】6. 安全开发

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 理解安全并将其融入软件开发生命周期 (SDLC) 中在软件开发环境中识别和应用安全控制评估软件安全的有效性评估获得软件对安全的影响定义并应用安全编码准则和标准 6.1. 系统开发控制 6.1.1. 软…

Python 标准库中的 csv 包

0. Abstract 官方文档很罗嗦&#xff0c;长篇大论例子少。本文将举例说明 csv 包的用法&#xff0c;然后补充一些必要的说明。 1.0 CSV 文件 CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的以纯文本形式存储数据的文件格式。它使用逗号作为字段之间的分隔符&#…

关于目标检测任务中,XML(voc格式)标注文件的可视化

1. 前言 最近在弄关于目标检测的任务&#xff0c;因为检测的图片和标签是分开的&#xff0c;可视化效果不明显&#xff0c;也不知道随便下载的数据集&#xff0c;标注信息对不对。网上看了好多代码&#xff0c;代码风格和本人平时不同&#xff0c;看起来麻烦&#xff0c;也不知…

C#:如何产生一个临时文件

在我们实际编程中&#xff0c;经常有将内容写到一个临时文件的需要。 比如&#xff1a;将网络上的图片下载下来&#xff0c;获取到图片的一些信息。 代码如下&#xff0c;看结果可知&#xff1a; 临时文件都是保存在系统临时文件夹的目录下&#xff0c;临时文件的扩展名统一…

计算机毕业设计 基于Java的供应商管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Java重修第二天—学习”方法“

通过学习本篇文章可以掌握如下知识 1、方法的定义 2、方法在计算机中的执行流程。 3、方法使用时常见问题 4、Java中方法的参数传递机制 5、方法重载 1 方法是什么 方法是一种语法结构&#xff0c;它可以把一段代码实现的某种功能封装起来&#xff0c;以便重复利用。 方…

代码+视频,手把手教你R语言使用forestploter包绘制单组及双组森林图

森林图在论文中很常见&#xff0c;多用于表示多因素分析中的变量与结果变量的比值效应&#xff0c;可以用图示的方法比较直观的绘制出来。既往我们在文章《R语言快速绘制多因素回归分析森林图&#xff08;1&#xff09;》已经介绍了怎么绘制森林图&#xff0c;但是绘图比较简单…

​电脑技巧:​笔记本电脑电流声的原因和解决方案

目录 一、音频设备接口接触不良 二、笔记本电源问题 三、笔记本电脑驱动程序问题 四、音频硬件问题 五、操作系统内部电磁干扰 六、最后总结 大家在日常生活当中&#xff0c;笔记本电脑已经成为我们工作、学习和娱乐的重要工具。但有时我们在使用过程中可能会遇到一个令人…

git回滚操作,常用场景

文章目录 git回滚操作1.git reset --hard 【版本号】2.回滚后的版本v2又想回到之前的版本v32.1 git reflog 3.git checkout -- 文件名4.git reset HEAD 文件名 git回滚操作 假设我们现在有三个版本 现在回滚一个版本 1.git reset --hard 【版本号】 发现只剩下两个版本了 2.…

git在本地创建dev分支并和远程的dev分支关联起来

文章目录 git在本地创建dev分支并和远程的dev分支关联起来1. 使用git命令2. 使用idea2.1 先删除上面建的本地分支dev2.2 通过idea建dev分支并和远程dev分支关联 3. 查看本地分支和远程分支的关系 git在本地创建dev分支并和远程的dev分支关联起来 1. 使用git命令 git checkout…