WPF Datepicker Calendar buttons not working (Using modified template)

流过昼夜 提交于 2021-01-27 21:27:47

问题


I apologize in advance if this is already out there (I did an advanced search and couldn't find this specific issue.)

I'm using a custom WPF Datepicker calendar template (Just changing colors really), but now my buttons don't work. It will pop up the calendar, but nothing works from that point, Am i missing anything? Here's the code below:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
xmlns:primitives="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit" >
<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="White" 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">
                    <primitives:CalendarItem x:Name="PART_CalendarItem" Style="{DynamicResource CalenderStyleNew}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="CalenderStyleNew" 
           TargetType="primitives:CalendarItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="primitives:CalendarItem">
                <ControlTemplate.Resources>
                    <!-- Start: Data template for header button -->
                    <DataTemplate x:Key="DayTitleTemplate">
                        <TextBlock
                                            FontWeight="Bold" 
                                            FontFamily="Verdana" 
                                            FontSize="9.5" 
                                            Foreground="Black" 
                                            HorizontalAlignment="Center"
                                            Text="{Binding}"
                                            Margin="0,6,0,6"
                                            VerticalAlignment="Center"/>
                    </DataTemplate>
                    <!-- End: Data template for header button -->
                    <DataTemplate x:Key="MonthTitleTemplate">
                        <TextBlock
                                            FontWeight="Medium" 
                                            FontFamily="Verdana" 
                                            FontSize="9.5" 
                                            Foreground="Red" 
                                            HorizontalAlignment="Center"
                                            Text="{Binding}"
                                            Margin="0,10,0,6"
                                            VerticalAlignment="Center"/>
                    </DataTemplate>
                </ControlTemplate.Resources>

                <Grid Name="PART_Root" >
                    <Grid.Resources>
                        <SolidColorBrush x:Key="DisabledColor" Color="#A5FFFFFF" />
                    </Grid.Resources>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="PART_DisabledVisual" Storyboard.TargetProperty="Opacity" To="1" Duration="0" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>

                    <Border 
                            BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}" 
                            CornerRadius="1">

                        <!-- This Brush is new -->
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0 0" EndPoint="0 1">
                                <GradientStop Offset="0"   Color="#FFE4EAF0" />
                                <GradientStop Offset="0.5" Color="#FFECF0F4" />
                                <GradientStop Offset="1"   Color="#FFECF0F4" />
                            </LinearGradientBrush>
                        </Border.Background>

                        <Border CornerRadius="1" BorderBrush="#FFFFFFFF" BorderThickness="2">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>

                                <Grid.Resources>
                                    <!-- Start: Previous button template -->
                                    <ControlTemplate x:Key="PreviousButtonTemplate" TargetType="{ x:Type Button}">
                                        <Grid Cursor="Hand">
                                            <VisualStateManager.VisualStateGroups>
                                                <VisualStateGroup x:Name="CommonStates">
                                                    <VisualState x:Name="Normal" />
                                                    <VisualState x:Name="MouseOver">
                                                        <Storyboard>
                                                            <ColorAnimation Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8" Duration="0" />
                                                        </Storyboard>
                                                    </VisualState>
                                                    <VisualState x:Name="Disabled">
                                                        <Storyboard>
                                                            <DoubleAnimation Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Opacity" To=".5" Duration="0" />
                                                        </Storyboard>
                                                    </VisualState>
                                                </VisualStateGroup>
                                            </VisualStateManager.VisualStateGroups>
                                            <Rectangle Fill="#11E5EBF1" Stretch="Fill" Opacity="1"/>
                                            <Grid>
                                                <Path Margin="14,-6,0,0" Height="10" Width="6" VerticalAlignment="Center" HorizontalAlignment="Left" Stretch="Fill" Data="M288.75,232.25 L288.75,240.625 L283,236.625 z">
                                                    <Path.Fill>
                                                        <SolidColorBrush x:Name="TextColor" Color="#FF333333" />
                                                    </Path.Fill>
                                                </Path>
                                            </Grid>
                                        </Grid>
                                    </ControlTemplate>
                                    <ControlTemplate x:Key="NextButtonTemplate" TargetType="{ x:Type Button}">
                                        <Grid Cursor="Hand">
                                            <VisualStateManager.VisualStateGroups>
                                                <VisualStateGroup x:Name="CommonStates">
                                                    <VisualState x:Name="Normal" />
                                                    <VisualState x:Name="MouseOver">
                                                        <Storyboard>
                                                            <ColorAnimation Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8" Duration="0" />
                                                        </Storyboard>
                                                    </VisualState>
                                                    <VisualState x:Name="Disabled">
                                                        <Storyboard>
                                                            <DoubleAnimation Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Opacity" To=".5" Duration="0" />
                                                        </Storyboard>
                                                    </VisualState>
                                                </VisualStateGroup>
                                            </VisualStateManager.VisualStateGroups>
                                            <Rectangle Fill="#11E5EBF1" Stretch="Fill" Opacity="1"/>
                                            <Grid>
                                                <Path Margin="0,-6,14,0" Height="10" Width="6" VerticalAlignment="Center" HorizontalAlignment="Right" Stretch="Fill" Data="M282.875,231.875 L282.875,240.375 L288.625,236 z">
                                                    <Path.Fill>
                                                        <SolidColorBrush x:Name="TextColor" Color="#FF333333" />
                                                    </Path.Fill>
                                                </Path>
                                            </Grid>
                                        </Grid>
                                    </ControlTemplate>

                                    <!-- End: Next button template -->

                                    <!-- Start: Header button template -->
                                    <ControlTemplate x:Key="HeaderButtonTemplate" TargetType="{ x:Type Button}">
                                        <Grid Cursor="Hand">
                                            <VisualStateManager.VisualStateGroups>
                                                <VisualStateGroup x:Name="CommonStates">
                                                    <VisualState x:Name="Normal" />
                                                    <VisualState x:Name="MouseOver">
                                                        <Storyboard>
                                                            <ColorAnimation Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="Blue" Duration="0" />
                                                        </Storyboard>
                                                    </VisualState>
                                                    <VisualState x:Name="Disabled">
                                                        <Storyboard>
                                                            <DoubleAnimation Storyboard.TargetName="buttonContent" Storyboard.TargetProperty="Opacity" To=".5" Duration="0" />
                                                        </Storyboard>
                                                    </VisualState>
                                                </VisualStateGroup>
                                            </VisualStateManager.VisualStateGroups>

                                            <!-- This Border is new -->
                                            <Border Padding="12 0"
                                                        CornerRadius="6">
                                                <Border.Background>
                                                    <LinearGradientBrush StartPoint="0 0" EndPoint="0 1">
                                                        <GradientStop Offset="0" Color="#FF73A9D8" />
                                                        <GradientStop Offset="1" Color="#FF73A9E8" />
                                                    </LinearGradientBrush>
                                                </Border.Background>

                                                <ContentPresenter
                                                    x:Name="buttonContent"
                                                    Content="{TemplateBinding Content}"
                                                    ContentTemplate="{TemplateBinding ContentTemplate}"
                                                    Margin="1,4,1,9"
                                                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                                    <TextElement.Foreground>
                                                        <SolidColorBrush x:Name="TextColor" Color="#FF333333"/>
                                                    </TextElement.Foreground>
                                                </ContentPresenter>
                                            </Border>
                                        </Grid>
                                    </ControlTemplate>
                                    <!-- End: Header button template -->

                                </Grid.Resources>

                                <!-- Start: Previous button content -->
                                <Button x:Name="PART_PreviousButton" 
                                        Grid.Row="0" Grid.Column="0"
                                        Template="{StaticResource PreviousButtonTemplate}" 
                                        Height="20" Width="28" 
                                        HorizontalAlignment="Left" 
                                        Focusable="False"
                                        />
                                <!-- End: Previous button content -->

                                <!-- Start: Header button content -->
                                <Button x:Name="PART_HeaderButton"                                             
                                        Grid.Row="0" Grid.Column="1" 
                                        Template="{StaticResource HeaderButtonTemplate}" 
                                        HorizontalAlignment="Center" VerticalAlignment="Center" 
                                        Height="28" Width="110"
                                        FontWeight="Bold" FontSize="10.5" 
                                        Focusable="False"
                                        />
                                <!-- End: Header button content -->

                                <!-- Start: Next button content -->
                                <Button x:Name="PART_NextButton" 
                                        Grid.Row="0" Grid.Column="2" 
                                        Height="20" Width="28" 
                                        HorizontalAlignment="Right" 
                                        Template="{StaticResource NextButtonTemplate}" 
                                        Focusable="False"
                                        />
                                <!-- End: Next button content -->

                                <!-- Start: Month Content Grid -->
                                <Grid x:Name="PART_MonthView" Grid.Row="1" Grid.ColumnSpan="3" Visibility="Visible" Margin="6,-1,6,6">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                    </Grid.ColumnDefinitions>
                                </Grid>
                                <!-- End: Month Content Grid -->

                                <!-- End: Year Content Grid -->
                                <Grid x:Name="PART_YearView" Grid.Row="1" Grid.ColumnSpan="3" Visibility="Hidden" Margin="6,-3,7,6">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                    </Grid.ColumnDefinitions>
                                </Grid>
                                <!-- End: Year Content Grid -->
                            </Grid>
                        </Border>
                    </Border>
                    <Rectangle x:Name="PART_DisabledVisual" Opacity="0" Visibility="Collapsed" Stretch="Fill" StrokeThickness="1" RadiusX="2" RadiusY="2" Stroke="{StaticResource DisabledColor}" Fill="{StaticResource DisabledColor}"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="PART_DisabledVisual" Property="Visibility" Value="Visible" />
                    </Trigger>
                    <DataTrigger Value="Year">
                        <DataTrigger.Binding>
                            <Binding Path="DisplayMode">
                                <Binding.RelativeSource>
                                    <RelativeSource Mode="FindAncestor" AncestorType="{x:Type Controls:Calendar}" />
                                </Binding.RelativeSource>
                            </Binding>
                        </DataTrigger.Binding>
                        <Setter TargetName="PART_MonthView" Property="Visibility" Value="Hidden" />
                        <Setter TargetName="PART_YearView" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                    <DataTrigger Value="Decade">
                        <DataTrigger.Binding>
                            <Binding Path="DisplayMode">
                                <Binding.RelativeSource>
                                    <RelativeSource Mode="FindAncestor" AncestorType="{x:Type Controls:Calendar}" />
                                </Binding.RelativeSource>
                            </Binding>
                        </DataTrigger.Binding>
                        <Setter TargetName="PART_MonthView" Property="Visibility" Value="Hidden" />
                        <Setter TargetName="PART_YearView" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Note: I've got this resource dictionary set at an application level and I'm globally binding the calendarstyle properties to all datepickers.

This is in an app level resource dictionary:

<Style TargetType="{x:Type DatePicker}">
  <Setter
        Property="CalendarStyle"
        Value="{StaticResource CalendarStyle1}" />
</Style>

And this is where the resource dictionaries are referenced (In case I did it wrong, I'm new to xaml

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary
                Source="ResourceDictionary/CustomCalendar.xaml" />
            <ResourceDictionary
                Source="ResourceDictionary/GlobalStyles.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

回答1:


Your problem is with your style TargetTypes. If you notice you have the style for your calendar defined as:

<Style x:Key="CalendarStyle1" TargetType="{x:Type Calendar}">

And the style for your CalendarItem defined as:

<Style x:Key="CalenderStyleNew" TargetType="primitives:CalendarItem">

The problem is that the Calendar type is from the standard System.Windows.Controls package but the CalendarItem is from the namespace Microsoft.Windows.Controls (that's the wpftoolkit namespace you have defined as primitives). So to fix this you have to either use ALL System.Windows.Controls in your styles or use ALL Microsoft.Windows.Controls namespaces.

I fixed your issue to use all Microsoft.Windows.Controls:

<Style x:Key="CalendarStyle1" TargetType="{x:Type Controls:Calendar}">

The global styles must be changed to:

<Style TargetType="{x:Type Controls:DatePicker}">
    <Setter
    Property="CalendarStyle"
    Value="{StaticResource CalendarStyle1}" />
</Style>

And to instantiate a DatePicker you must use the correct one:

<Controls:DatePicker />

NOT

<DatePicker />

If you don't reference it from the WpfToolkit namespace it won't have your custom styles.

Cheers, Eric



来源:https://stackoverflow.com/questions/19305922/wpf-datepicker-calendar-buttons-not-working-using-modified-template

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!