接上篇
wpf日历控件制作过程分析(1)---定义header
在header中,我们看到了定义一个
自定义样式TitleStyle
1.自定义样式
看后台代码定义

Code

/**//// <summary>
/// The DependencyProperty for the TitleStyle property.
/// Flags: none
/// Default Value: null
/// </summary>
public static readonly DependencyProperty TitleStyleProperty =
DependencyProperty.Register(
"TitleStyle",
typeof(Style),
typeof(MonthCalendar),
new FrameworkPropertyMetadata(
(Style)null));


/**//// <summary>
/// TitleStyle property
/// </summary>
public Style TitleStyle

{

get
{ return (Style)GetValue(TitleStyleProperty); }

set
{ SetValue(TitleStyleProperty, value); }
}
应该说,是比较简单的,默认样式为null,如果指定了样式的话,则会覆盖默认的样式
2.不重叠选择样式
为日历的前进和后退按钮定义两个样式

Code

/**//// <summary>
/// The DependencyProperty for the PreviousButtonStyle property.
/// Flags: none
/// Default Value: null
/// </summary>
public static readonly DependencyProperty PreviousButtonStyleProperty =
DependencyProperty.Register(
"PreviousButtonStyle",
typeof(Style),
typeof(MonthCalendar),
new FrameworkPropertyMetadata(
(Style)null, new PropertyChangedCallback(OnPreviousButtonStyleChanged)));


/**//// <summary>
/// PreviousButtonStyle property
/// </summary>
public Style PreviousButtonStyle

{

get
{ return (Style)GetValue(PreviousButtonStyleProperty); }

set
{ SetValue(PreviousButtonStyleProperty, value); }
}

private static void OnPreviousButtonStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

{
((MonthCalendar)d).RefreshPreviousButtonStyle();
}


/**//// <summary>
/// The DependencyProperty for the NextButtonStyle property.
/// Flags: none
/// Default Value: null
/// </summary>
public static readonly DependencyProperty NextButtonStyleProperty =
DependencyProperty.Register(
"NextButtonStyle",
typeof(Style),
typeof(MonthCalendar),
new FrameworkPropertyMetadata(
(Style)null, new PropertyChangedCallback(OnNextButtonStyleChanged)));


/**//// <summary>
/// NextButtonStyle property
/// </summary>
public Style NextButtonStyle

{

get
{ return (Style)GetValue(NextButtonStyleProperty); }

set
{ SetValue(NextButtonStyleProperty, value); }
}

private static void OnNextButtonStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

{
((MonthCalendar)d).RefreshNextButtonStyle();
}
再来这个
RefreshNextButtonStyle方法

Code
private void RefreshNextButtonStyle()

{
ButtonBase nextButton = GetTemplateChild(c_NextButtonName) as ButtonBase;
if (nextButton != null)

{
if (NextButtonStyle == null)

{
if (_defaultNextButtonStyle == null)

{
_defaultNextButtonStyle = FindResource(new ComponentResourceKey(typeof(MonthCalendar), "NextButtonStyleKey")) as Style;
}
nextButton.Style = _defaultNextButtonStyle;
}
else

{
nextButton.Style = NextButtonStyle;
}
}
}
注意点:
1.
GetTemplateChild可以获取到xaml中声明了key值的元素,c_NextButtonName变量就是xaml定义的key,此key应该公开给控件的使用者,可调整样式
2.用
TemplatePart公开模块样式,如两个按钮的key值
[TemplatePart(Name = "PART_PreviousButton", Type = typeof(ButtonBase))]
[TemplatePart(Name = "PART_NextButton", Type = typeof(ButtonBase))]
3.
_defaultNextButtonStyle还是从xaml去找,其目的是为了自定义样式不会与默认样式发生冲突.可以title样式比较
4.构建可视化模板需要在
OnApplyTemplate方法中使用,如上面的
RefreshNextButtonStyle方法必须在
OnApplyTemplate方法中调用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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常用元数据和基类