WPF自定义日历选择控件

目录

XAML样式代码:

XAML调用自定义样式

C#后端响应函数


效果对比:

原控件:

自定义样式:

XAML样式代码:

复制代码
    <Window.Resources>
        <Style x:Key="CustomDatePickerStyle" TargetType="DatePicker">
            <Setter Property="BorderBrush" Value="Gray"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="DatePicker">
                        <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <!-- 文本部分(居中) -->
                                <DatePickerTextBox x:Name="PART_TextBox" Grid.Column="0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="18" Background="Transparent" BorderThickness="0"/>
                                <!-- 日历按钮(放大并靠右) -->
                                <ToggleButton x:Name="PART_Button" Grid.Column="1" Width="40" Height="40" FontSize="24" Content="📅" Background="Transparent" BorderThickness="0" Click="ToggleCalendarPopup" Focusable="False"/>
                                <!-- 弹出日历 -->
                                <Popup x:Name="PART_Popup" Placement="Bottom" PlacementTarget="{Binding ElementName=PART_Button}" StaysOpen="False">
                                    <Border Background="White" BorderBrush="LightGray" BorderThickness="1">
                                        <Calendar x:Name="PART_Calendar" DisplayDate="{TemplateBinding DisplayDate}" SelectedDate="{TemplateBinding SelectedDate}"/>
                                    </Border>
                                </Popup>
                            </Grid>
                        </Border>
                        <!-- 控制弹出逻辑 -->
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsDropDownOpen" Value="True">
                                <Setter TargetName="PART_Popup" Property="IsOpen" Value="True"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

XAML调用自定义样式

cs 复制代码
<DatePicker Style="{StaticResource CustomDatePickerStyle}" FontSize="22" BorderThickness="1"/>

C#后端响应函数

cs 复制代码
        //手动绑定日历选择
        private void ToggleCalendarPopup(object sender, RoutedEventArgs e)
        {
            if (sender is ToggleButton button &&
                button.TemplatedParent is DatePicker picker)
            {
                picker.IsDropDownOpen = !picker.IsDropDownOpen;
            }
        }
相关推荐
Scout-leaf5 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
柒.梧.7 天前
基于SpringBoot+JWT 实现Token登录认证与登录人信息查询
wpf
十月南城10 天前
Flink实时计算心智模型——流、窗口、水位线、状态与Checkpoint的协作
大数据·flink·wpf
听麟13 天前
HarmonyOS 6.0+ 跨端会议助手APP开发实战:多设备接续与智能纪要全流程落地
分布式·深度学习·华为·区块链·wpf·harmonyos
@hdd13 天前
Kubernetes 可观测性:Prometheus 监控、日志采集与告警
云原生·kubernetes·wpf·prometheus
zls36536513 天前
C# WPF canvas中绘制缺陷分布map
开发语言·c#·wpf
专注VB编程开发20年13 天前
c#Redis扣款锁的设计,多用户,多台电脑操作
wpf
闲人编程14 天前
定时任务与周期性调度
分布式·python·wpf·调度·cron·定时人物·周期性
zls36536514 天前
C# WPF canvas中绘制缺陷分布map并实现缩放
开发语言·c#·wpf
数据知道15 天前
PostgreSQL:Citus 分布式拓展,水平分片,支持海量数据与高并发
分布式·postgresql·wpf