Мой стиль / шаблон контроля вычеркивает даты моего календаря - PullRequest
1 голос
/ 26 апреля 2010

Мой 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));

Но когда я добавляю стиль, я не получаю отображаемых затемненных дисплеев, и еще хуже можно выбрать даты затемнения.

Я не уверен, что я пропустил, но я надеюсь, что у кого-то есть простой ответ, чтобы мне не пришлось перестраивать весь виджет.

Любая помощь приветствуется.

Спасибо

Chris

Ответы [ 2 ]

1 голос
/ 20 мая 2010

Хорошо ... этого не было, но я оставлю этот ответ следующему человеку.

First BlackoutDates - это какая-то ужасная мешанина из коллекции только для чтения. В значительной степени необъяснимо. Я возился с переписыванием виджета, но не зашел так далеко.

Я нашел что-то, что работает. Вы можете установить диапазон затемнения в коде.

Однако, если вы делаете это во время построения, оно не передается через шаблон (не знаю почему). Так что если вы создаете календарь, а затем установите диапазон затемнения, который работает. Но когда вы создаете стиль для этого Календаря, у него нет привязок шаблона (поскольку он не является свойством зависимости, его нельзя связать).

Однако ... похоже, что если вы установите 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));
    }
1 голос
/ 28 апреля 2010

В твоем стиле я не вижу, где ты уважаешь "затемненные даты". Как выглядит базовый стиль? Я предполагаю, что в базовом стиле в элементе управления 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}"
                 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...