WPF 日历 header 背景

WPF Calendar header background

我已经为日历创建了一个自定义样式,似乎我得到了除了 header 颜色(背景)之外的所有内容,我找不到如何更改。此背景在日、月和年视图中可见。

到目前为止我已经提取了 4 个模板(在 Blend 中),并且没有粘贴所有模板的代码(它的默认模板),我将只展示我如何在日历样式中引用它们:

 <Style x:Key="CustomCalendarStyle" TargetType="{x:Type Calendar}">
   <Setter Property="CalendarButtonStyle"
           Value="{StaticResource CustomCalendarButtonStyle}" />
   <Setter Property="CalendarDayButtonStyle"
           Value="{StaticResource CustomCalendarDayButtonStyle}" />
   <Setter Property="Template">
     <Setter.Value>
       <ControlTemplate TargetType="{x:Type Calendar}">
         <Grid x:Name="PART_Root">
           <CalendarItem x:Name="PART_CalendarItem"
                         BorderBrush="{TemplateBinding BorderBrush}"
                         BorderThickness="{TemplateBinding BorderThickness}"
                         Background="{TemplateBinding Background}"
                         Style="{DynamicResource CustomCalendarItemStyle}" />
         </Grid>
       </ControlTemplate>
     </Setter.Value>
   </Setter>
 </Style>

如果我们假设他们四个都有默认的 xaml 代码,有谁知道这个背景设置在哪里(2018 年 11 月的那个)?这 3 种样式(CalendarButtonStyle、CalendarDayButtonStyle、CalendarItemStyle...)中似乎没有设置它。

我找到了一种 'dirty' 方法来实现这一点,方法是将 CalendarItemStyle' 模板的外边框设置为透明(这基本上设置了整个日历背景),然后在添加PART_HeaderButton、PART_PreviousButton 和 PART_NextButton。

我很好奇这个背景是哪里设置的原画。有人玩过日历样式吗?

这是从 Calendar 控件的 Background 属性 设置的。如果您从 BlendVisual Studio 编辑 Control 本身的 Template;你会得到,

<Style x:Key="CalendarStyle1" 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="#FFE4EAF0" Offset="0"/>
                <GradientStop Color="#FFECF0F4" Offset="0.16"/>
                <GradientStop Color="#FFFCFCFD" Offset="0.16"/>
                <GradientStop Color="#FFFFFFFF" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="BorderBrush">
        <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFA3AEB9" Offset="0"/>
                <GradientStop Color="#FF8399A9" Offset="0.375"/>
                <GradientStop Color="#FF718597" Offset="0.375"/>
                <GradientStop Color="#FF617584" 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>

Background 设置的 LinearGradientBrush 定义了 header 背景颜色。不确定为什么以这种方式实施;就是这样。