Hey Guys!
WPF gives us
DatePicker but it doesn’t give us TimePicker. I tried to create a very simple
TimePicker user control.
And the bumper
offer is that it is free. Use it wherever you want. J
Hope this will help
you a lot.
XAML Code:
==========
I used TextBlocks to show Hours and Minutes. Up and Down buttons are attached to increment decrement hours and minutes. Drop down with AM/PM values actually add/subtracts 12 hours from actual time based on your selection. I have created SelectedTime dependency property to do bindings.
| 
<UserControl x:Class="UserControls.ucDateTimeUpDown" 
             mc:Ignorable="d"> 
    <Grid> 
        <Border BorderBrush="Black" BorderThickness=".25" /> 
        <StackPanel Orientation="Horizontal"> 
            <TextBlock x:Name="AddHoursTextBox" 
                       MinWidth="20" 
                       HorizontalAlignment="Center" 
                       VerticalAlignment="Center" 
                       Text="{Binding DisplayTimeHours, 
                                      Mode=OneWay}" 
                       TextAlignment="Center" /> 
            <StackPanel HorizontalAlignment="Center" 
                        VerticalAlignment="Center" 
                        Orientation="Vertical"> 
                <Button x:Name="HourUpButton" Click="HourUpButton_OnClick"> 
                    <Button.Template> 
                        <ControlTemplate TargetType="Button"> 
                            <Border BorderBrush="Black" BorderThickness=".25"> 
                                <Viewbox Width="10" Height="10"> 
                                    <Image Source="{StaticResource UpImage}" /> 
                                </Viewbox> 
                            </Border> 
                        </ControlTemplate> 
                    </Button.Template> 
                </Button> 
                <Button x:Name="HourDownButton" 
                        Margin="0,-1,0,0" 
                        Click="HourDownButton_OnClick"> 
                    <Button.Template> 
                        <ControlTemplate TargetType="Button"> 
                            <Border BorderBrush="Black" BorderThickness=".25"> 
                                <Viewbox Width="10" Height="10"> 
                                    <Image Source="{StaticResource DownImage}" /> 
                                </Viewbox> 
                            </Border> 
                        </ControlTemplate> 
                    </Button.Template> 
                </Button> 
            </StackPanel> 
            <TextBlock Margin="3,0,0,0" 
                       HorizontalAlignment="Center" 
                       VerticalAlignment="Center" 
                       Text="h." /> 
            <TextBlock Margin="3,0,0,0" 
                       HorizontalAlignment="Center" 
                       VerticalAlignment="Center" 
                       Text=":" 
                       TextAlignment="Center" /> 
            <TextBlock x:Name="AddMinutesTextBox" 
                       MinWidth="20" 
                       HorizontalAlignment="Center" 
                       VerticalAlignment="Center" 
                       Text="{Binding DisplayTimeMinutes, 
                                      Mode=OneWay}" 
                       TextAlignment="Center" /> 
            <StackPanel HorizontalAlignment="Center" 
                        VerticalAlignment="Center" 
                        Orientation="Vertical"> 
                <Button x:Name="MinutesUpButton" Click="MinutesUpButton_OnClick"> 
                    <Button.Template> 
                        <ControlTemplate TargetType="Button"> 
                            <Border BorderBrush="Black" BorderThickness=".25"> 
                                <Viewbox Width="10" Height="10"> 
                                    <Image Source="{StaticResource UpImage}" /> 
                                </Viewbox> 
                            </Border> 
                        </ControlTemplate> 
                    </Button.Template> 
                </Button> 
                <Button x:Name="MinutesDownButton" 
                        Margin="0,-1,0,0" 
                        Click="MinutesDownButton_OnClick"> 
                    <Button.Template> 
                        <ControlTemplate TargetType="Button"> 
                            <Border BorderBrush="Black" BorderThickness="0.25"> 
                                <Viewbox Width="10" Height="10"> 
                                    <Image Source="{StaticResource DownImage}" /> 
                                </Viewbox> 
                            </Border> 
                        </ControlTemplate> 
                    </Button.Template> 
                </Button> 
            </StackPanel> 
            <TextBlock Margin="3,0,3,0" 
                       HorizontalAlignment="Center" 
                       VerticalAlignment="Center" 
                       Text="m." /> 
            <ComboBox x:Name="AmPmComboBox" 
                      MinWidth="45" 
                      HorizontalAlignment="Center" 
                      VerticalAlignment="Center" 
                      BorderThickness=".25" 
                      ItemsSource="{Binding AmPmTypes}" 
                      SelectedItem="{Binding DisplayAmPm}" /> 
        </StackPanel> 
    </Grid> 
</UserControl> | 
Code behind:
=========
The code behind may not be so good. We can restructure and re-factor this code. I made this user control in hurry so pardon me for code quality.
| 
using System; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 
namespace UserControls 
{ 
  /// <summary> 
  /// Interaction logic for ucDateTimeUpDown.xaml 
  /// </summary> 
  public partial class ucDateTimeUpDown : UserControl, INotifyPropertyChanged 
  { 
    #region Private Member variable 
    private DateTime _currentTime = DateTime.UtcNow; 
    private bool _adHours; 
    private bool _addMinutes; 
    private ObservableCollection<string> _amPmTypes  
= new ObservableCollection<string>(); 
    private string _displayAmPm; 
    #endregion 
    #region Constructors 
    public ucDateTimeUpDown() 
    { 
      InitializeComponent(); 
      this.DataContext = this; 
      AmPmTypes.Add("AM"); 
      AmPmTypes.Add("PM"); 
      CurrentTime = DateTime.UtcNow.ToLocalTime(); 
      SelectedTime = CurrentTime.ToLocalTime().ToString("t"); 
    } 
    #endregion 
    #region Public Properties 
    public ObservableCollection<string> AmPmTypes 
    { 
      get { return _amPmTypes; } 
      set { _amPmTypes = value; } 
    } 
    public string DisplayTime 
    { 
      get { return _currentTime.ToLocalTime().ToString("t"); } 
    } 
    public string DisplayAmPm 
    { 
      get 
      { 
        if (_currentTime.ToLocalTime().Hour >= 0  
&& _currentTime.ToLocalTime().Hour < 12) 
          _displayAmPm = AmPmTypes.FirstOrDefault(s => s.Equals("AM")); 
        else 
        { 
          if (_currentTime.ToLocalTime().Hour >= 12) 
          { 
            _displayAmPm = AmPmTypes.FirstOrDefault(s => s.Equals("PM")); 
          } 
        } 
        return _displayAmPm; 
      } 
      set 
      { 
        if (!value.Equals(_displayAmPm)) 
        { 
          if (value.Equals("PM")) 
            CurrentTime = CurrentTime.ToLocalTime().AddHours(12); 
          else 
          { 
            CurrentTime = CurrentTime.ToLocalTime().AddHours(-12); 
          } 
        } 
        _displayAmPm = value; 
      } 
    } 
    public string DisplayTimeHours 
    { 
      get 
      { 
        var hours = _currentTime.ToLocalTime().Hour; 
        return hours > 12 ? (hours - 12).ToString("00") : hours.ToString("00"); 
        //return hours.ToString(); 
      } 
      set 
      { 
        var hour = 0; 
        Int32.TryParse(value, out hour); 
        CurrentTime = CurrentTime.ToLocalTime().AddHours(hour); 
        OnPropertyChanged("DisplayTime"); 
        OnPropertyChanged("DisplayTimeHours"); 
        OnPropertyChanged("DisplayTimeMinutes"); 
      } 
    } 
    public string DisplayTimeMinutes 
    { 
      get { return _currentTime.ToLocalTime().Minute.ToString("00"); } 
      set 
      { 
        var minutes = 0; 
        Int32.TryParse(value, out minutes); 
        CurrentTime = CurrentTime.ToLocalTime().AddMinutes(minutes); 
        OnPropertyChanged("DisplayTime"); 
        OnPropertyChanged("DisplayTimeHours"); 
        OnPropertyChanged("DisplayTimeMinutes"); 
      } 
    } 
    public DateTime CurrentTime 
    { 
      get { return _currentTime; } 
      set 
      { 
        _currentTime = value; 
        OnPropertyChanged("CurrentTime"); 
        OnPropertyChanged("DisplayTime"); 
        OnPropertyChanged("DisplayTimeHours"); 
        OnPropertyChanged("DisplayTimeMinutes"); 
        OnPropertyChanged("DisplayAmPm"); 
        SelectedTime = value.ToLocalTime().ToString("t"); 
      } 
    } 
    #endregion 
    #region Dependency Properties 
    public static readonly DependencyProperty SelectedTimeProperty  
= DependencyProperty.Register( 
      "SelectedTime", typeof (string), typeof (ucDateTimeUpDown),  
new PropertyMetadata(default(string))); 
    public string SelectedTime 
    { 
      get { return ((DateTime) GetValue(SelectedTimeProperty)) 
.ToLocalTime().ToString("t"); } 
      set { SetValue(SelectedTimeProperty, value); } 
    } 
    #endregion 
    #region Methods 
    private void MinutesUpButton_OnClick(object sender, RoutedEventArgs e) 
    { 
      CurrentTime = CurrentTime.AddMinutes(1); 
      SelectedTime = CurrentTime.ToLocalTime().ToString("t"); 
    } 
    private void MinutesDownButton_OnClick(object sender, RoutedEventArgs e) 
    { 
      CurrentTime = CurrentTime.AddMinutes(-1); 
      SelectedTime = CurrentTime.ToLocalTime().ToString("t"); 
    } 
    private void HourUpButton_OnClick(object sender, RoutedEventArgs e) 
    { 
      CurrentTime = CurrentTime.AddHours(1); 
      SelectedTime = CurrentTime.ToLocalTime().ToString("t"); 
    } 
    private void HourDownButton_OnClick(object sender, RoutedEventArgs e) 
    { 
      CurrentTime = CurrentTime.AddHours(-1); 
      SelectedTime = CurrentTime.ToLocalTime().ToString("t"); 
    } 
    #endregion 
    #region INotifyPropertyChanged Implementation 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string propertyName) 
    { 
      if (null != PropertyChanged) 
      { 
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
    } 
    #endregion 
  } 
} | 
 
 
Hi Siddharth!
ReplyDeleteI like your solution and I want to use it, but I have a problem. I store the time data in sql database, and when I want to write them in a DataDrid the initial values are always the current hour-minutes. Please help me, how can I pass my stored data.
Best regads, Csaba Papp
Wpf: Simple Timepicker User Control For Wpf >>>>> Download Now
ReplyDelete>>>>> Download Full
Wpf: Simple Timepicker User Control For Wpf >>>>> Download LINK
>>>>> Download Now
Wpf: Simple Timepicker User Control For Wpf >>>>> Download Full
>>>>> Download LINK 2E