接上篇
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 方法中调用