WPF 日期选取器日历按钮不起作用(使用修改后的模板)

本文关键字:修改 选取 日期 日历 不起作用 按钮 WPF | 更新日期: 2023-09-27 18:35:03

如果这已经存在,我提前道歉(我进行了高级搜索,找不到这个特定问题。

我正在使用自定义 WPF 日期选择器日历模板(实际上只是更改颜色(,但现在我的按钮不起作用。它会弹出日历,但从那时起没有任何效果,我错过了什么吗?下面是代码:

<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>

注意:我已经在应用程序级别设置了此资源字典,并且我将日历样式属性全局绑定到所有日期选择器。

这是在应用级资源字典中:

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

这是引用资源字典的地方(万一我做错了,我是 xaml 的新手

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

WPF 日期选取器日历按钮不起作用(使用修改后的模板)

你的问题在于你的风格 TargetTypes。如果您注意到日历的样式定义为:

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

日历项的样式定义为:

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

问题是日历类型来自标准的System.Windows.Controls包,但CalendarItem来自命名空间Microsoft.Windows.Controls(即您定义为primitives的wpftoolkit命名空间(。因此,要解决此问题,您必须在样式中使用ALL System.Windows.Controls或使用ALL Microsoft.Windows.Controls命名空间。

我修复了您的问题以使用所有Microsoft.Windows.Controls:

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

全局样式必须更改为:

<Style TargetType="{x:Type Controls:DatePicker}">
    <Setter
    Property="CalendarStyle"
    Value="{StaticResource CalendarStyle1}" />
</Style>
要实例化日期选择器,

您必须使用正确的日期选择器:

<Controls:DatePicker />

<DatePicker />

如果不从 WpfToolkit 命名空间引用它,它将没有自定义样式。

干杯埃里克