我的样式/控件模板输出了我的日历的限制日期

时间:2010-04-26 16:43:12

标签: c# wpf calendar styles

我的C#/ WPF项目需要一个日历。我们将使用它来为预约安排选择一系列日期。我被告知默认日历太小而无法被我们的一些销售代表使用,所以我一直在努力调整它。

<toolkit:Calendar Grid.Row="1" x:Name="DateWindowCalendar" 
   BorderBrush="White" BorderThickness="0"
   Style="{StaticResource PopupCalendarStyle}" 
   DisplayMode="Month" SelectionMode="SingleRange"
   DisplayDateStart="{Binding FirstDayOfMonth}"
   AutomationProperties.AutomationId="ToolkitCalendarId"  
   VerticalAlignment="Top">
 </toolkit:Calendar>

我创造了这种造型:

<Style x:Key="PopupCalendarStyle" TargetType="toolkit:Calendar">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="toolkit:Calendar">
        <StackPanel Margin="0" HorizontalAlignment="Center" x:Name="Root">
          <toolkit:Calendar x:Name="Calendar" 
             SelectedDate="{TemplateBinding SelectedDate}"
             DisplayDateStart="{TemplateBinding DisplayDateStart}"
             SelectionMode="{TemplateBinding SelectionMode}"
             Background="{TemplateBinding Background}" 
             BorderBrush="{TemplateBinding BorderBrush}"
             BorderThickness="{TemplateBinding BorderThickness}"
             SelectedDatesChanged="Calendar_SelectedDatesChanged">

             <toolkit:Calendar.CalendarDayButtonStyle>
               <Style>
                 <Setter Property="Button.Height" Value="34"/>
                 <Setter Property="Button.Width" Value="34" />
                 <Setter Property="Button.FontSize" Value="16" />
               </Style>
              </toolkit:Calendar.CalendarDayButtonStyle>

              <toolkit:Calendar.CalendarButtonStyle>
                <Style>
                  <Setter Property="Button.Height" Value="34"/>
                  <Setter Property="Button.Width" Value="34"/>
                  <Setter Property="Button.FontSize" Value="16"/>
                </Style>
              </toolkit:Calendar.CalendarButtonStyle>

            </toolkit:Calendar>
          </StackPanel>
        </ControlTemplate>
      </Setter.Value>
    </Setter>               
  </Style>

一切都近乎完美。我指定了我的范围,我可以跟踪选定的日期(使用SelectedDatesChanged事件而不是SelectedDates属性授予。

问题是我还需要能够设置中断日期(通常是月初至今之间的时间段,尽管有时从一个月的第一天到现在的几天)。

没有样式,这有效:

DateWindowCalendar.BlackoutDates.Add(new CalendarDateRange(
   new DateTime(DateTime.Now.Year, DateTime.Now.Month, 01), DateTime.Now));

但是当我添加样式时,我不会显示黑屏显示,更糟糕的是可以选择限制日期。

我不确定我错过了什么,但我希望有人能够轻松回答,这样我就无需重建整个小部件。

感谢任何帮助。

谢谢,

克里斯

2 个答案:

答案 0 :(得分:1)

按照你的风格,我看不出你在哪里尊重“限制日期”。基本风格是什么样的?我假设在基本样式中,Calendar控件上有一个名为blackout date的属性,它绑定到BlackoutDates Collection。

这样的事情:

    <Style x:Key="PopupCalendarStyle" TargetType="toolkit:Calendar">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="toolkit:Calendar">
            <StackPanel Margin="0" HorizontalAlignment="Center" x:Name="Root">
              <toolkit:Calendar x:Name="Calendar" 
                 SelectedDate="{TemplateBinding SelectedDate}"
                 DisplayDateStart="{TemplateBinding DisplayDateStart}"
                 BlackoutDates="{TemplateBinding BlackoutDates}"
                 SelectionMode="{TemplateBinding SelectionMode}"
                 Background="{TemplateBinding Background}" 
                 BorderBrush="{TemplateBinding BorderBrush}"
                 BorderThickness="{TemplateBinding BorderThickness}"
                 SelectedDatesChanged="Calendar_SelectedDatesChanged">

                 <toolkit:Calendar.CalendarDayButtonStyle>
                   <Style>
                     <Setter Property="Button.Height" Value="34"/>
                     <Setter Property="Button.Width" Value="34" />
                     <Setter Property="Button.FontSize" Value="16" />
                   </Style>
                  </toolkit:Calendar.CalendarDayButtonStyle>

                  <toolkit:Calendar.CalendarButtonStyle>
                    <Style>
                      <Setter Property="Button.Height" Value="34"/>
                      <Setter Property="Button.Width" Value="34"/>
                      <Setter Property="Button.FontSize" Value="16"/>
                    </Style>
                  </toolkit:Calendar.CalendarButtonStyle>

                </toolkit:Calendar>
              </StackPanel>
            </ControlTemplate>
          </Setter.Value>
        </Setter>               
      </Style>

答案 1 :(得分:1)

好的......那不是它,但我会把这个答案留给下一个人。

第一个BlackoutDates是一些可读的范围集合的可怕的混合物。几乎无法辨认。我开始重写小部件,但没有那么远。

我找到了有用的东西。您可以在代码中设置中断范围。

但是,如果在构造期间执行此操作,则不会通过模板传递(不确定原因)。因此,如果您构建一个日历,然后设置有效的中断范围。但是当你设置那个Calendar时,它没有模板绑定(因为它不是一个依赖属性,它不能被绑定)。

但是......看起来如果你通过样式生成的事件设置BlackoutDates,则设置日期。我使用了加载的事件:

            <Style x:Key="PopupCalendarStyle" TargetType="toolkit:Calendar">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="toolkit:Calendar">
                        <StackPanel Margin="0" HorizontalAlignment="Center" x:Name="Root">
                            <toolkit:Calendar x:Name="Calendar" 
                                              SelectedDate="{TemplateBinding SelectedDate}"
                                              DisplayDateStart="{TemplateBinding DisplayDateStart}"
                                              SelectionMode="{TemplateBinding SelectionMode}"
                                              Background="{TemplateBinding Background}" 
                                              BorderBrush="{TemplateBinding BorderBrush}"
                                              BorderThickness="{TemplateBinding BorderThickness}"
                                              SelectedDatesChanged="Calendar_SelectedDatesChanged"
                                              **Loaded="Calendar_Loaded"**>
                                <toolkit:Calendar.CalendarDayButtonStyle>
                                    <Style>
                                        <Setter Property="Button.Height" Value="34"/>
                                        <Setter Property="Button.Width" Value="34" />
                                        <Setter Property="Button.FontSize" Value="16" />
                                    </Style>
                                </toolkit:Calendar.CalendarDayButtonStyle>
                                <toolkit:Calendar.CalendarButtonStyle>
                                    <Style>
                                        <Setter Property="Button.Height" Value="34"/>
                                        <Setter Property="Button.Width" Value="34"/>
                                        <Setter Property="Button.FontSize" Value="16"/>
                                    </Style>
                                </toolkit:Calendar.CalendarButtonStyle>
                            </toolkit:Calendar>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>               
        </Style>

完成后,创建一个允许我在样式日历上设置BlackoutDates的加载处理程序是相当简单的:

        private void Calendar_Loaded(object sender, RoutedEventArgs e)
    {
        ((Calendar)sender).BlackoutDates.Add(new CalendarDateRange(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 01), DateTime.Now));
    }