代码改变世界

wpf日历控件制作过程分析(1)---定义header

  Clingingboy  阅读(2538)  评论(0编辑  收藏  举报
希望通过分析能更好的理解wpf控件的开发



一.日历的header布局

包含两部分,两个按钮和一个Title



首先定义按钮的样式(随自己定),可以先定义几个状态为普通状态,鼠标经过状态,按下状态和禁用4个状态显示不同的样式.其中按钮上还有一个小三角.所以还要定义一个三角的Geometry

代码开始

1.画出Geometry(涉及知识点为Geometry的画法及迷你语法,如M Z等)
<PathGeometry x:Key="geometry" Figures="M0,0 4.5,4 9,0 5.5,0 4.5,1 3.5,0z"/>

2.定义4个不同状态下的笔刷(可自由发挥)

Code

3.定义按钮样式,按钮上再使用上面的笔刷
Code

注意点
1.这里的TargetType是ButtonBase,因为有可能按钮是Button或RepeatButton都有可能,这里指向为ButtonBase是一种通用的做法
2.为何不直接定义还要为Button定义样式?,这里提供的样式为默认样式(下面我们会讲到)
3.ComponentResourceKey将资源定义在指定程序集中,在后端访问的方法如下
FindResource(new ComponentResourceKey(typeof(MonthCalendar), "PreviousButtonStyleKey")) as Style;

4.定义Title类,在静态构造函数中用OverrideMetadata方法重写样式(多数控件都需要这么做)

        static MonthCalendarTitle()
        
{
            DefaultStyleKeyProperty.OverrideMetadata(
typeof(MonthCalendarTitle), new FrameworkPropertyMetadata(typeof(MonthCalendarTitle)));
        }

然后定义一个Title

Code

注意上面黑字,这里使用了数据绑定的类型转换器,只要给这个控件指定数据源就可以了,其作用是把日期转换上面第二张截图的格式

5.整合header

Code

注意点:
1.使用DataContext作为数据源
2.用RepeatButton当作按钮(可重复触发事件)
3.使用LayoutTransform翻转Geometry图形
4.自定义样式TitleStyle,默认为空
5.未见RepeatButton使用定义的ButtonBase样式?(可与第四点比较)

下次继续
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2007-06-18 能够支持反编译asp.net ajax客户端脚本的软件
2007-06-18 AjaxControlToolkit常用元数据和基类
点击右上角即可分享
微信分享提示