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;
            }
        }
相关推荐
界面开发小八哥5 小时前
界面控件DevExpress WPF v26.1新版亮点 - 模板工具包 & MVVM功能全新升级
wpf·界面控件·devexpress·ui开发·.net 10
记忆停留w2 天前
Celery+Redis 分布式异步任务队列工程落地业务逻辑
大数据·人工智能·redis·分布式·缓存·架构·wpf
雪靡2 天前
WPF PerMonitorV2 下的跨窗口问题
c#·wpf
listening7773 天前
HarmonyOS 6.1 分布式文件服务实战:跨设备商品图片/视频秒开方案
wpf·harmonyos
Macbethad3 天前
基于WPF的半导体设备EAP控制程序架构设计与实现
wpf
国服第二切图仔4 天前
HarmonyOS APP《画伴梦工厂》开发第60篇-分布式软总线2.0——多设备协同新范式
分布式·wpf·harmonyos
精神底层4 天前
拒绝 UI 卡死!我用 CSnakes 实时拦截 Python 训练流,在 WPF 中重构了 ScottPlot 5 高性能 AI 看板
python·ui·wpf
爱吃大芒果4 天前
不用多设备模拟器跑通 ShareKit 碰一碰分享
华为·wpf·harmonyos
贪玩的小松鼠5 天前
WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核
wpf
界面开发小八哥5 天前
界面控件DevExpress WPF v26.1新版亮点 - TreeView、Spreadsheet控件功能升级
.net·wpf·界面控件·devexpress·ui开发