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;
            }
        }
相关推荐
玖笙&15 小时前
✨WPF编程基础【3.3】:容器控件(附源码)
c++·wpf·visual studio
5008420 小时前
GE 怎么做算子融合
分布式·架构·开源·wpf
500841 天前
Conv + BN + ReLU 融合:省掉两次显存读写
flutter·架构·开源·wpf·音视频
500841 天前
把 FlashAttention 讲清楚
flutter·electron·wpf
500842 天前
ATC 做了什么:从 ONNX 到 .om
分布式·架构·开源·wpf·开源鸿蒙
500842 天前
Graph Engine 是什么,为什么需要它
java·人工智能·性能优化·ocr·wpf
一念春风2 天前
.md文件浏览器
c#·wpf
lingxiao168882 天前
Wpf常用样式与自定义控件(仪表盘,管道,分页器等)
wpf
LateFrames2 天前
520 - 如何说晚安 (WPF)
c#·wpf·浪漫·ui体验
heimeiyingwang3 天前
【架构实战】日志体系ELK:集中化日志管理实践
elk·架构·wpf