自定义Calendar全局样式未对DatePicker内嵌日历生效该如何解决?
原因说明
WPF 中仅指定 TargetType、无 x:Key 的隐式样式,默认不会自动应用到控件模板内部嵌套的同类型控件。DatePicker 的默认模板内嵌的 Calendar 控件优先级高于全局隐式样式,因此你的自定义样式只会对独立使用的 Calendar 生效,无法作用于 DatePicker 弹出的日历。
解决方案
你不需要修改原有 Calendar 样式的逻辑,只需新增一段 DatePicker 的隐式样式,指定其 CalendarStyle 关联你定义的 Calendar 样式即可,有两种实现方式可选:
方式1:给Calendar样式加唯一标识(推荐,后续复用更灵活)
- 给你现有Calendar样式添加x:Key属性:
<Style x:Key="CustomOrangeCalendarStyle" TargetType="{x:Type Calendar}"> <!-- 原有样式内容保持不变 --> <Setter Property="Foreground" Value="#FF333333"/> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="Orange" Offset="0"/> <GradientStop Color="Orange" Offset="0.16"/> <GradientStop Color="White" Offset="0.16"/> <GradientStop Color="White" Offset="0.4"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderBrush"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="Orange" Offset="0"/> <GradientStop Color="Orange" Offset="0.375"/> <GradientStop Color="Orange" Offset="0.375"/> <GradientStop Color="Orange" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Calendar}"> <StackPanel x:Name="PART_Root" HorizontalAlignment="Center"> <CalendarItem x:Name="PART_CalendarItem" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Style="{TemplateBinding CalendarItemStyle}"/> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style>
- 新增全局DatePicker隐式样式:
<Style TargetType="{x:Type DatePicker}"> <Setter Property="CalendarStyle" Value="{StaticResource CustomOrangeCalendarStyle}"/> </Style>
方式2:直接引用全局隐式Calendar样式(无需修改原有Calendar样式)
如果不想给原有样式加x:Key,直接添加下面这段DatePicker样式即可:
<Style TargetType="{x:Type DatePicker}"> <Setter Property="CalendarStyle" Value="{StaticResource {x:Type Calendar}}"/> </Style>
两种方式都可以让所有DatePicker的内嵌日历和独立Calendar控件的样式保持一致。
内容的提问来源于stack exchange,提问作者sadrick
相关产品推荐
相关产品推荐

