小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何改變格式的DateTimePicker的WPF應用程序(例如日/ MMM /年)實用

 牛人的尾巴 2016-03-07

如何改變格式的DateTimePicker的WPF應用程序(例如日/ MMM /年)



.net wpf 日期時間datetime datetimepicker datetime-format
我想更改日期的WPF應用程序中選擇了格式
本文地址 :CodeGo.net/38065/
-------------------------------------------------------------------------------------------------------------------------
1. 我被這個問題rencetly處理。我發(fā)現(xiàn)執(zhí)行此自定義格式的簡單方法,我希望這幫助你。你需要做的優(yōu)先件事情就是申請一個特定的樣式到當前的DatePicker就這樣,在您的XAML:
<DatePicker.Resources>
 <Style TargetType="{x:Type DatePickerTextBox}">
  <Setter Property="Control.Template">
   <Setter.Value>
    <ControlTemplate>
     <TextBox x:Name="PART_TextBox" Width="113" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Text="{Binding Path=SelectedDate,Converter={StaticResource DateTimeFormatter},RelativeSource={RelativeSource AncestorType={x:Type DatePicker}},ConverterParameter=dd-MMM-yyyy}" BorderBrush="{DynamicResource BaseBorderBrush}" />
    </ControlTemplate>
   </Setter.Value>
  </Setter>
 </Style>
</DatePicker.Resources>
正如你可以在這部分看到,存在一個叫于作出具有constraints力的“PART_TextBox”的Text屬性轉換。該轉換器接收,包括您的自定義格式。最后,我們添加的代碼在C#中的轉換器。
public class DateTimeConverter : IValueConverter
{
 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
  DateTime? selectedDate = value as DateTime?;
  if (selectedDate != null)
  {
   string dateTimeFormat = parameter as string;
   return selectedDate.Value.ToString(dateTimeFormat);
  }
  return "Select Date";
 }
 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
 {
  try
  {
   var valor = value as string;
   if (!string.IsNullOrEmpty(valor))
   {
    var retorno = DateTime.Parse(valor);
    return retorno;
   }
   return null;
  }
  catch
  {
   return DependencyProperty.UnsetValue;
  }
 }
}
我希望這對您有所幫助。請知道的任何問題或建議進行改進。
2.
Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd-MMM-yyyy";  

3. 在XAML中:
<toolkit:DatePicker SelectedDateFormat="Long" />
<toolkit:DatePicker SelectedDateFormat="Short" />

4. 感謝@費爾南多?加西亞本作的基礎。 我自己編寫的DatePicker的一個DateFormat的附加屬性,讓你提供一個格式字符串的顯示和輸入。 對于輸入它會嘗試所提供的格式 CodeGo.net,回跌至試圖與當前區(qū)域性的格式解析它。 有問題的格式:
<DatePicker my:DatePickerDateFormat.DateFormat="dd/MMM/yyyy"/>
DATEFORMAT的附加屬性是:
public class DatePickerDateFormat
{
 public static readonly DependencyProperty DateFormatProperty =
  DependencyProperty.RegisterAttached("DateFormat", typeof (string), typeof (DatePickerDateFormat),
           new PropertyMetadata(OnDateFormatChanged));
 public static string GetDateFormat(DependencyObject dobj)
 {
  return (string) dobj.GetValue(DateFormatProperty);
 }
 public static void SetDateFormat(DependencyObject dobj, string value)
 {
  dobj.SetValue(DateFormatProperty, value);
 }
 private static void OnDateFormatChanged(DependencyObject dobj, DependencyPropertyChangedEventArgs e)
 {
  var datePicker = (DatePicker) dobj;
  Application.Current.Dispatcher.BeginInvoke(
   DispatcherPriority.Loaded, new Action<DatePicker>(ApplyDateFormat), datePicker);
 }
 private static void ApplyDateFormat(DatePicker datePicker)
 {
  var binding = new Binding("SelectedDate")
   {
    RelativeSource = new RelativeSource {AncestorType = typeof (DatePicker)},
    Converter = new DatePickerDateTimeConverter(),
    ConverterParameter = new Tuple<DatePicker, string>(datePicker, GetDateFormat(datePicker))
   };
  var textBox = GetTemplateTextBox(datePicker);
  textBox.SetBinding(TextBox.TextProperty, binding);
  textBox.PreviewKeyDown -= TextBoxOnPreviewKeyDown;
  textBox.PreviewKeyDown += TextBoxOnPreviewKeyDown;
  datePicker.CalendarOpened -= DatePickerOnCalendarOpened;
  datePicker.CalendarOpened += DatePickerOnCalendarOpened;
 }
 private static TextBox GetTemplateTextBox(Control control)
 {
  control.ApplyTemplate();
  return (TextBox) control.Template.FindName("PART_TextBox", control);
 }
 private static void TextBoxOnPreviewKeyDown(object sender, KeyEventArgs e)
 {
  if (e.Key != Key.Return)
   return;
  /* DatePicker subscribes to its TextBox's KeyDown event to set its SelectedDate if Key.Return was
   * pressed. When this happens its text will be the result of its internal date parsing until it
   * loses focus or another date is selected. A workaround is to stop the KeyDown event bubbling up
   * and handling setting the DatePicker.SelectedDate. */
  e.Handled = true;
  var textBox = (TextBox) sender;
  var datePicker = (DatePicker) textBox.TemplatedParent;
  var dateStr = textBox.Text;
  var formatStr = GetDateFormat(datePicker);
  datePicker.SelectedDate = DatePickerDateTimeConverter.StringToDateTime(datePicker, formatStr, dateStr);
 }
 private static void DatePickerOnCalendarOpened(object sender, RoutedEventArgs e)
 {
  /* When DatePicker's TextBox is not focused and its Calendar is opened by clicking its calendar button
   * its text will be the result of its internal date parsing until its TextBox is focused and another
   * date is selected. A workaround is to set this string when it is opened. */
  var datePicker = (DatePicker) sender;
  var textBox = GetTemplateTextBox(datePicker);
  var formatStr = GetDateFormat(datePicker);
  textBox.Text = DatePickerDateTimeConverter.DateTimeToString(formatStr, datePicker.SelectedDate);
 }
 private class DatePickerDateTimeConverter : IValueConverter
 {
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
   var formatStr = ((Tuple<DatePicker, string>) parameter).Item2;
   var selectedDate = (DateTime?) value;
   return DateTimeToString(formatStr, selectedDate);
  }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
   var tupleParam = ((Tuple<DatePicker, string>) parameter);
   var dateStr = (string) value;
   return StringToDateTime(tupleParam.Item1, tupleParam.Item2, dateStr);
  }
  public static string DateTimeToString(string formatStr, DateTime? selectedDate)
  {
   return selectedDate.HasValue ? selectedDate.Value.ToString(formatStr) : null;
  }
  public static DateTime? StringToDateTime(DatePicker datePicker, string formatStr, string dateStr)
  {
   DateTime date;
   var canParse = DateTime.TryParseExact(dateStr, formatStr, CultureInfo.CurrentCulture,
             DateTimeStyles.None, out date);
   if (!canParse)
    canParse = DateTime.TryParse(dateStr, CultureInfo.CurrentCulture, DateTimeStyles.None, out date);
   return canParse ? date : datePicker.SelectedDate;
  }
 }
}

5.
DatePicker1.SelectedDate = DatePicker1.SelectedDate.Value.ToString("dd/MM/yyyy")

6. 通常情況下,日期格式存儲在資源文件中,這將有助于在應用程序的國際化。 你可以拿起格式從資源文件ToString(DATE_FORMAT)你的情況可能要
dateTimePicker.SelectedDate.ToString("dd-MMM-yyyy");

7. 由于改用變化DatePicker格式(如Thread.CurrentCulture)是不是一個好主意。 當然,你可以創(chuàng)建Control源自DatePicker喜歡和依賴屬性Format,但是這花費太多精力。 簡單而優(yōu)雅的解決方案,我覺得是有constraints力的值不SelectedDate本身,而是財產(chǎn)(ToolTip屬性為這個),并更新此屬性時SelectedDate被改變。 C#進行單向綁定看起來像這樣:
 DatePicker datePicker = new DatePicker();
 datePicker.SetBinding(ToolTipProperty, "Date");
 datePicker.SelectedDateChanged += (s, ea) =>
  {
   DateTime? date = datePicker.SelectedDate;
   string value = date != null ? date.Value.ToString("yyyy-MM-dd") : null;
   datePicker.ToolTip = value;
  };
XAML +C??雌饋響撓襁@樣: XAML:
<DatePicker ToolTip="{Binding Date Mode=TwoWay}"
   SelectedDateChanged="DatePicker_SelectedDateChanged"/>
C#中:
private void DatePicker_SelectedDateChanged(object sender, EventArgs ea)
{
 DatePicker datePicker = (DatePicker)sender;
 DateTime? date = datePicker.SelectedDate;
 string value = date != null ? date.Value.ToString("yyyy-MM-dd") : null;
 datePicker.ToolTip = value;
}
對于雙向手柄ToolTipChanged事件來更新方式SelectedDate。
本文標題 :如何改變格式的DateTimePicker的WPF應用程序(例如日/ MMM /年)
本文地址 :CodeGo.net/38065/ 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多