2016-07-08 3 views
0

Я написал следующий стильDatepicker стиль не работают

<Window x:Class="Wpf_ViewModelbased1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     DataContext="{Binding Source={StaticResource ViewModelLocator}, Path=MainVm}" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <!--Datepicker--> 
     <Style TargetType="{x:Type DatePicker}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type DatePicker}"> 
         <Border BorderBrush="Black" BorderThickness="1"> 
          <Grid x:Name="PART_Root" > 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="Auto" /> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition/> 
            <RowDefinition/> 
           </Grid.RowDefinitions> 
           <DatePickerTextBox x:Name="PART_TextBox" HorizontalContentAlignment="Center" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="Center" IsReadOnly="True" Grid.Row="1"/> 
           <Button x:Name="PART_Button" Grid.Row="0"> 
            <Button.Style> 
             <Style TargetType="{x:Type Button}"> 
              <Setter Property="Template"> 
               <Setter.Value> 
                <ControlTemplate TargetType="{x:Type Button}"> 
                 <Image x:Name="buttonImage" Height="35" Width="35" HorizontalAlignment="center" Source="C:\Users\00027887\Documents\Visual Studio 2015\Projects\RelWA\RelWA\Resources\datepickerincon.png"/> 
                </ControlTemplate> 
               </Setter.Value> 
              </Setter> 
             </Style> 
            </Button.Style> 
           </Button> 
           <Popup x:Name="PART_Popup" StaysOpen="False" AllowsTransparency="True"> 
            <CalendarItem x:Name="PART_CalendarItem"> 
             <CalendarItem.Style> 
              <Style TargetType="{x:Type CalendarItem}"> 
               <Setter Property="Template"> 
                <Setter.Value> 
                 <ControlTemplate TargetType="{x:Type CalendarItem}"> 
                  <Calendar SelectedDate="{x:Static sys:DateTime.Today}"> 
                   <Calendar.Background> 
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
                     <GradientStop Color="Turquoise" Offset="0.7"/> 
                     <GradientStop Color="White"/> 
                     <GradientStop Color="green" Offset="1"/> 
                    </LinearGradientBrush> 
                   </Calendar.Background> 
                  </Calendar> 
                 </ControlTemplate> 
                </Setter.Value> 
               </Setter> 
              </Style> 
             </CalendarItem.Style> 
            </CalendarItem> 
           </Popup> 
          </Grid> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <DatePicker Width="100" Height="75"/> 
    </Grid> 
</Window> 

В окне Desinger все выглядит, как ожидалось:

enter image description here

Но когда я отладки приложения:

enter image description here

I не знаю, почему.

ответ

0

Когда визуализируется DatePicker, его метод OnApplyTemplate. Если вы шпионить этот метод вы найдете этот кусок кода:

this._popUp = (base.GetTemplateChild("PART_Popup") as Popup); 
if (this._popUp != null) 
{ 
    this._popUp.AddHandler(UIElement.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(this.PopUp_PreviewMouseLeftButtonDown)); 
    this._popUp.Opened += new EventHandler(this.PopUp_Opened); 
    this._popUp.Closed += new EventHandler(this.PopUp_Closed); 
    this._popUp.Child = this._calendar; 
    if (this.IsDropDownOpen) 
    { 
     this._popUp.IsOpen = true; 
    } 
} 

Как вы можете видеть, Child свойство вашего «PART_Popup» всегда перезаписаны с календарным управления, который является частным поле DatePicker сам. Поэтому нецелесообразно указывать ребенка для Popup в вашем ControlTemplate. Просто оставьте его пустым, то есть без ребенка.

Для настройки стиля каландра, а не просто использовать CalendarStyle свойство:

<DatePicker Width="100" Height="75"> 
    <DatePicker.CalendarStyle> 
     <Style TargetType="{x:Type Calendar}"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="Turquoise" Offset="0.7"/> 
         <GradientStop Color="White"/> 
         <GradientStop Color="green" Offset="1"/> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DatePicker.CalendarStyle> 
</DatePicker> 

Я надеюсь, что это может помочь вам с вашей проблемой.

Смежные вопросы