Datepicker风格不起作用

时间:2016-07-08 09:07:26

标签: c# wpf datepicker calendar styles

我写过以下风格

<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

我不知道为什么。

1 个答案:

答案 0 :(得分: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;
    }
}

如您所见,“ PART_Popup ”的Child属性始终会被日历控件覆盖,该日历控件是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>

我希望它可以帮助您解决问题。