【问题标题】:How To Use DateTimePicker In WPF?如何在 WPF 中使用 DateTimePicker?
【发布时间】:2009-02-18 12:14:24
【问题描述】:

我不知道如何在 WPF 中使用 DateTimePicker 控件。它在工具箱中不可用。

【问题讨论】:

    标签: wpf datetimepicker


    【解决方案1】:

    请注意:以下答案仅适用于 3.5 Framework 下的 WPF,因为 NET 4.0 运行时有自己的 datetime control

    默认情况下,WPF 3.5 没有像 winforms 这样的日期时间选择器。

    但是,在 Microsoft 生产的 WPF tool kit 中添加了一个日期选择器,可以是 downloaded here。我猜它会在未来的版本中成为框架的一部分。

    添加对 WPFToolkit.dll 的引用很简单,在工具箱中查看它并按照网站上的说明与您的应用程序一起分发。

    在此之前,其他人已经创建了第 3 方选择器(您可能更喜欢),或者使用了不太理想的解决方案,即在 WPF 应用程序中使用 winforms 控件。

    更新:这个问题与this one 非常相似,它也有一个指向walk through for the datepicker 的链接以及其他链接。

    【讨论】:

    • 只是一个小预防措施,工具包尚未准备好投入生产:codeplex.com/wpf/Wiki/View.aspx?title=VSM%20Memory%20Leak
    • 罢工 - 它已在 1 月重新发布中修复。
    • 您指的是日期选择器而不是日期时间选择器。我认为 WPF Toolkit 中没有这种情况。
    • 这个答案是[Obsolete] :)
    • @greg - 我已经更新了答案以澄清这仅适用于 3.5 框架
    【解决方案2】:

    这是刚进来的;)

    .NET 4.0 运行时中有一个用于 WPF 的新 DatePicker 类: http://msdn.microsoft.com/en-us/library/system.windows.controls.datepicker.aspx

    另请参阅“WPF 中的新增功能”以了解更多不错的功能: http://msdn.microsoft.com/en-us/library/bb613588.aspx

    【讨论】:

    • WPF 的 DatePicker 控件不支持时间组件,但是 WPF Toolkit Extended 的 DateTimePicker 支持(我一直在用)
    【解决方案3】:

    WPF 没有开箱即用的 DateTime 选择器。

    当然有很多第三方日期时间选择器 :)

    http://www.devcomponents.com/dotnetbar-wpf/WPFDateTimePicker.aspx

    http://marlongrech.wordpress.com/2007/09/11/wpf-datepicker/

    http://www.codeplex.com/AvalonControlsLib

    只需快速 google 即可找到更多信息!

    【讨论】:

      【解决方案4】:

      我认为这个 DateTimePicker 之前没有提到过:

      A WPF DateTimePicker That Works Like the One in Winforms

      那是在 VB 中,有一些错误。我将其转换为 C# 并创建了 new version with bug fixes

      注意:我在 WPFToolkit 中使用了日历控件,以便可以使用 .NET 3.5 而不是 .NET 4。如果您使用的是 .NET 4,只需删除 XAML 中对“wpftc”的引用即可。

      【讨论】:

        【解决方案5】:

        关于 WPF Extended WPF Toolkit Release 1.4.0 中嵌入的控件,请参考 http://elegantcode.com/2011/04/08/extended-wpf-toolkit-release-1-4-0/

        有关日历和 DatePicker 演练,请参阅, http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-calendar-datepicker-walkthrough.aspx

        您可以通过 Microsoft Expression Studio [Use Edit Template option] 自定义外观 示例显示在这里:

        将以下命名空间添加到 xaml 页面

        xmlns:toolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended"
        xmlns:Microsoft_Windows_Controls_Core_Converters="clr-namespace:Microsoft.Windows.Controls.Core.Converters;assembly=WPFToolkit.Extended" 
        xmlns:Microsoft_Windows_Controls_Chromes="clr-namespace:Microsoft.Windows.Controls.Chromes;assembly=WPFToolkit.Extended"
        

        在页面/窗口资源中添加以下内容

        <!--DateTimePicker Customized Style-->
                <Style x:Key="DateTimePickerStyle1" TargetType="{x:Type toolkit:DateTimePicker}">
                    <Setter Property="TimeWatermarkTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <ContentControl Content="{Binding}" Foreground="Gray" Focusable="False"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="WatermarkTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <ContentControl Content="{Binding}" Foreground="Gray" Focusable="False"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type toolkit:DateTimePicker}">
                                <Border>
                                    <Grid>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="Auto"/>
                                            </Grid.ColumnDefinitions>
        
                                            <toolkit:DateTimeUpDown AllowSpin="{TemplateBinding AllowSpin}" 
                                                                          BorderThickness="1,1,0,1" 
                                                                          FormatString="{TemplateBinding FormatString}" 
                                                                          Format="{TemplateBinding Format}" 
                                                                          ShowButtonSpinner="{TemplateBinding ShowButtonSpinner}" 
                                                                          Value="{Binding Value, RelativeSource={RelativeSource TemplatedParent}}" 
                                                                          WatermarkTemplate="{TemplateBinding WatermarkTemplate}" 
                                                                          Watermark="{TemplateBinding Watermark}" 
                                                                          Foreground="#FFEFE3E3" 
                                                                          BorderBrush="#FFEBB31A">
                                                <toolkit:DateTimeUpDown.Background>
                                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                                        <GradientStop Color="Black" Offset="0"/>
                                                        <GradientStop Color="#FF2F2828" Offset="1"/>
                                                    </LinearGradientBrush>
                                                </toolkit:DateTimeUpDown.Background>
                                            </toolkit:DateTimeUpDown>
        
                                            <ToggleButton x:Name="_calendarToggleButton" 
                                                          Background="{x:Null}" Grid.Column="1" IsChecked="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}}">
                                                <ToggleButton.IsHitTestVisible>
                                                    <Binding Path="IsOpen" RelativeSource="{RelativeSource TemplatedParent}">
                                                        <Binding.Converter>
                                                            <Microsoft_Windows_Controls_Core_Converters:InverseBoolConverter/>
                                                        </Binding.Converter>
                                                    </Binding>
                                                </ToggleButton.IsHitTestVisible>
                                                <ToggleButton.Style>
                                                    <Style TargetType="{x:Type ToggleButton}">
                                                        <Setter Property="Template">
                                                            <Setter.Value>
                                                                <ControlTemplate TargetType="{x:Type ToggleButton}">
                                                                    <Grid SnapsToDevicePixels="True">
                                                                        <Microsoft_Windows_Controls_Chromes:ButtonChrome x:Name="ToggleButtonChrome" CornerRadius="0,2.75,2.75,0" InnerCornerRadius="0,1.75,1.75,0" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" BorderBrush="{x:Null}">
                                                                            <Microsoft_Windows_Controls_Chromes:ButtonChrome.Background>
                                                                                <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                                                                                    <GradientStop Color="#FFF3F3F3" Offset="1"/>
                                                                                    <GradientStop Color="#7FC0A112"/>
                                                                                </LinearGradientBrush>
                                                                            </Microsoft_Windows_Controls_Chromes:ButtonChrome.Background>
                                                                        </Microsoft_Windows_Controls_Chromes:ButtonChrome>
                                                                        <Grid>
                                                                            <Grid.ColumnDefinitions>
                                                                                <ColumnDefinition Width="*"/>
                                                                                <ColumnDefinition Width="Auto"/>
                                                                            </Grid.ColumnDefinitions>
                                                                            <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Stretch" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Stretch"/>
                                                                            <Grid x:Name="arrowGlyph" Grid.Column="1" IsHitTestVisible="False" Margin="5">
                                                                                <Path Data="M0,1C0,1 0,0 0,0 0,0 3,0 3,0 3,0 3,1 3,1 3,1 4,1 4,1 4,1 4,0 4,0 4,0 7,0 7,0 7,0 7,1 7,1 7,1 6,1 6,1 6,1 6,2 6,2 6,2 5,2 5,2 5,2 5,3 5,3 5,3 4,3 4,3 4,3 4,4 4,4 4,4 3,4 3,4 3,4 3,3 3,3 3,3 2,3 2,3 2,3 2,2 2,2 2,2 1,2 1,2 1,2 1,1 1,1 1,1 0,1 0,1z" Fill="#FF82E511" Height="4" Width="7"/>
                                                                            </Grid>
                                                                        </Grid>
                                                                    </Grid>
                                                                </ControlTemplate>
                                                            </Setter.Value>
                                                        </Setter>
                                                    </Style>
                                                </ToggleButton.Style>
                                            </ToggleButton>
                                        </Grid>
        
                                        <Popup IsOpen="{Binding IsChecked, ElementName=_calendarToggleButton}" StaysOpen="False">
                                            <Border BorderThickness="1" Padding="3">
                                                <Border.BorderBrush>
                                                    <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="#FFD2C217" Offset="1"/>
                                                    </LinearGradientBrush>
                                                </Border.BorderBrush>
                                                <Border.Background>
                                                    <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                        <GradientStop Color="White" Offset="0"/>
                                                        <GradientStop Color="#FFE9B116" Offset="1"/>
                                                    </LinearGradientBrush>
                                                </Border.Background>
                                                <StackPanel Background="{x:Null}">
                                                    <Calendar x:Name="Part_Calendar" BorderThickness="0" DisplayDate="2011-06-28" Background="#7FE0B41A"/>
                                                    <toolkit:TimePicker x:Name="Part_TimeUpDown" Format="ShortTime" Value="{Binding Value, RelativeSource={RelativeSource TemplatedParent}}" WatermarkTemplate="{TemplateBinding TimeWatermarkTemplate}" Watermark="{TemplateBinding TimeWatermark}" Background="{x:Null}" Style="{DynamicResource TimePickerStyle1}"/>
                                                </StackPanel>
                                            </Border>
                                        </Popup>
                                    </Grid>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
        
                <Style x:Key="TimePickerStyle1" 
                       TargetType="{x:Type toolkit:TimePicker}">
                    <Setter Property="WatermarkTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <ContentControl Content="{Binding}" Foreground="Gray" Focusable="False"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type toolkit:TimePicker}">
                                <Border>
                                    <Grid>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="Auto"/>
                                            </Grid.ColumnDefinitions>
                                            <Grid>
                                                <toolkit:DateTimeUpDown x:Name="PART_TimeUpDown" AllowSpin="{TemplateBinding AllowSpin}" BorderThickness="1,1,0,1" FormatString="{TemplateBinding FormatString}" ShowButtonSpinner="{TemplateBinding ShowButtonSpinner}" Value="{Binding Value, RelativeSource={RelativeSource TemplatedParent}}" WatermarkTemplate="{TemplateBinding WatermarkTemplate}" Watermark="{TemplateBinding Watermark}" Background="#7FE0B41A" BorderBrush="#FFF9F2F2">
                                                    <toolkit:DateTimeUpDown.Format>
                                                        <TemplateBinding Property="Format">
                                                            <TemplateBinding.Converter>
                                                                <Microsoft_Windows_Controls_Core_Converters:TimeFormatToDateTimeFormatConverter/>
                                                            </TemplateBinding.Converter>
                                                        </TemplateBinding>
                                                    </toolkit:DateTimeUpDown.Format>
                                                </toolkit:DateTimeUpDown>
                                            </Grid>
                                            <ToggleButton x:Name="_timePickerToggleButton" Grid.Column="1" IsChecked="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}}" >
                                                <ToggleButton.IsHitTestVisible>
                                                    <Binding Path="IsOpen" RelativeSource="{RelativeSource TemplatedParent}">
                                                        <Binding.Converter>
                                                            <Microsoft_Windows_Controls_Core_Converters:InverseBoolConverter/>
                                                        </Binding.Converter>
                                                    </Binding>
                                                </ToggleButton.IsHitTestVisible>
                                                <ToggleButton.Style>
                                                    <Style TargetType="{x:Type ToggleButton}">
                                                        <Setter Property="Template">
                                                            <Setter.Value>
                                                                <ControlTemplate TargetType="{x:Type ToggleButton}">
                                                                    <Grid SnapsToDevicePixels="True">
                                                                        <Microsoft_Windows_Controls_Chromes:ButtonChrome x:Name="ToggleButtonChrome" CornerRadius="0,2.75,2.75,0" InnerCornerRadius="0,1.75,1.75,0" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"/>
                                                                        <Grid>
                                                                            <Grid.ColumnDefinitions>
                                                                                <ColumnDefinition Width="*"/>
                                                                                <ColumnDefinition Width="Auto"/>
                                                                            </Grid.ColumnDefinitions>
                                                                            <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Stretch" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Stretch"/>
                                                                            <Grid x:Name="arrowGlyph" Grid.Column="1" IsHitTestVisible="False" Margin="5">
                                                                                <Path Data="M0,1C0,1 0,0 0,0 0,0 3,0 3,0 3,0 3,1 3,1 3,1 4,1 4,1 4,1 4,0 4,0 4,0 7,0 7,0 7,0 7,1 7,1 7,1 6,1 6,1 6,1 6,2 6,2 6,2 5,2 5,2 5,2 5,3 5,3 5,3 4,3 4,3 4,3 4,4 4,4 4,4 3,4 3,4 3,4 3,3 3,3 3,3 2,3 2,3 2,3 2,2 2,2 2,2 1,2 1,2 1,2 1,1 1,1 1,1 0,1 0,1z" Fill="Black" Height="4" Width="7"/>
                                                                            </Grid>
                                                                        </Grid>
                                                                    </Grid>
                                                                </ControlTemplate>
                                                            </Setter.Value>
                                                        </Setter>
                                                    </Style>
                                                </ToggleButton.Style>
                                            </ToggleButton>
                                        </Grid>
        
                                        <Popup IsOpen="{Binding IsChecked, ElementName=_timePickerToggleButton}" StaysOpen="False">
                                            <Border BorderThickness="1">
                                                <Border.Background>
                                                    <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                        <GradientStop Color="White" Offset="0"/>
                                                        <GradientStop Color="#FFE7C857" Offset="1"/>
                                                    </LinearGradientBrush>
                                                </Border.Background>
                                                <Border.BorderBrush>
                                                    <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>
                                                </Border.BorderBrush>
        
                                                <Grid>
                                                    <ListBox x:Name="PART_TimeListItems" BorderThickness="0" DisplayMemberPath="Display" Height="130" Width="150" Background="#7FE0B41A">
                                                        <ListBox.ItemContainerStyle>
                                                            <Style TargetType="{x:Type ListBoxItem}">
                                                                <Setter Property="Template">
                                                                    <Setter.Value>
                                                                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                                                            <Border x:Name="Border" SnapsToDevicePixels="True">
                                                                                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Margin="4"/>
                                                                            </Border>
                                                                            <ControlTemplate.Triggers>
                                                                                <Trigger Property="IsMouseOver" Value="True">
                                                                                    <Setter Property="Background" TargetName="Border" Value="#FFE7F5FD"/>
                                                                                </Trigger>
                                                                                <Trigger Property="IsSelected" Value="True">
                                                                                    <Setter Property="Background" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                                                                                    <Setter Property="Foreground" Value="White"/>
                                                                                </Trigger>
                                                                            </ControlTemplate.Triggers>
                                                                        </ControlTemplate>
                                                                    </Setter.Value>
                                                                </Setter>
                                                            </Style>
                                                        </ListBox.ItemContainerStyle>
                                                    </ListBox>
                                                </Grid>
                                            </Border>
                                        </Popup>
                                    </Grid>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
        

        在 Window 中,您可以将样式用作

        谢谢,

        【讨论】:

          【解决方案6】:

          如果你想要一个没有外部库的,我确实改进了 Qwertie 的那个。可以在这里找到:https://stackoverflow.com/a/69241500/9758687

          【讨论】:

            【解决方案7】:

            WPF Tool Kit 中有 DatePicker,但是我没有在 WPF ToolKit 中看到 DateTime Picker。所以我不知道 John 说的是哪种 DateTimePicker 控件。

            【讨论】:

              【解决方案8】:

              Extended Toolkit 中有一个 DateTimePicker

              【讨论】:

                猜你喜欢
                • 2013-07-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多