8 ответов:
Я решил эту проблему с помощью этого кода. Надеюсь, что это поможет вам всем, а также.
<Style TargetType="{x:Type DatePickerTextBox}"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate, StringFormat='dd MMM yyyy', RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" /> </ControlTemplate> </Setter.Value> </Setter> </Style>
Судя по ответу Wonko, вы не можете указать формат даты в формате Xaml или путем наследования от DatePicker.
Я поместил следующий код в конструктор моего представления, который переопределяет ShortDateFormat для текущего потока:
CultureInfo ci = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name); ci.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy"; Thread.CurrentThread.CurrentCulture = ci;
Инструментарий WPF
DateTimePickerтеперь имеет свойствоFormatи свойствоFormatString. Если в качестве типа формата указатьCustom, можно указать собственную строку формата.<wpftk:DateTimePicker Value="{Binding Path=StartTime, Mode=TwoWay}" Format="Custom" FormatString="MM/dd/yyyy hh:mmtt"/>
Принятый ответ (Спасибо @petrycol) поставил меня на правильный путь, но я получал другую границу текстового поля и цвет фона в пределах фактического выбора даты. Исправлено с помощью следующего кода.
<Style TargetType="{x:Type Control}" x:Key="DatePickerTextBoxStyle"> <Setter Property="BorderThickness" Value="0"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="Background" Value="{x:Null}"/> </Style> <Style TargetType="{x:Type DatePickerTextBox}" > <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate, StringFormat='dd-MMM-yyyy', RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" Style="{StaticResource DatePickerTextBoxStyle}" > </TextBox> </ControlTemplate> </Setter.Value> </Setter> </Style>
Примечание: этот ответ (первоначально написанный в 2010 году) относится к более ранним версиям. Смотрите другие ответы для использования пользовательского формата с более новыми версиями
К сожалению, если вы говорите о XAML, вы застряли с установкой SelectedDateFormat на "Long" или "Short".
Если вы загрузили исходный код инструментария вместе с двоичными файлами, вы можете увидеть, как он определен. Вот некоторые из основных моментов этого код:
Датепикер.cs
#region SelectedDateFormat /// <summary> /// Gets or sets the format that is used to display the selected date. /// </summary> public DatePickerFormat SelectedDateFormat { get { return (DatePickerFormat)GetValue(SelectedDateFormatProperty); } set { SetValue(SelectedDateFormatProperty, value); } } /// <summary> /// Identifies the SelectedDateFormat dependency property. /// </summary> public static readonly DependencyProperty SelectedDateFormatProperty = DependencyProperty.Register( "SelectedDateFormat", typeof(DatePickerFormat), typeof(DatePicker), new FrameworkPropertyMetadata(OnSelectedDateFormatChanged), IsValidSelectedDateFormat); /// <summary> /// SelectedDateFormatProperty property changed handler. /// </summary> /// <param name="d">DatePicker that changed its SelectedDateFormat.</param> /// <param name="e">DependencyPropertyChangedEventArgs.</param> private static void OnSelectedDateFormatChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { DatePicker dp = d as DatePicker; Debug.Assert(dp != null); if (dp._textBox != null) { // Update DatePickerTextBox.Text if (string.IsNullOrEmpty(dp._textBox.Text)) { dp.SetWaterMarkText(); } else { DateTime? date = dp.ParseText(dp._textBox.Text); if (date != null) { dp.SetTextInternal(dp.DateTimeToString((DateTime)date)); } } } } #endregion SelectedDateFormat private static bool IsValidSelectedDateFormat(object value) { DatePickerFormat format = (DatePickerFormat)value; return format == DatePickerFormat.Long || format == DatePickerFormat.Short; } private string DateTimeToString(DateTime d) { DateTimeFormatInfo dtfi = DateTimeHelper.GetCurrentDateFormat(); switch (this.SelectedDateFormat) { case DatePickerFormat.Short: { return string.Format(CultureInfo.CurrentCulture, d.ToString(dtfi.ShortDatePattern, dtfi)); } case DatePickerFormat.Long: { return string.Format(CultureInfo.CurrentCulture, d.ToString(dtfi.LongDatePattern, dtfi)); } } return null; }DatePickerFormat.cs
public enum DatePickerFormat { /// <summary> /// Specifies that the date should be displayed /// using unabbreviated days of the week and month names. /// </summary> Long = 0, /// <summary> /// Specifies that the date should be displayed ///using abbreviated days of the week and month names. /// </summary> Short = 1 }
Класс преобразователя:
public class DateFormat : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return null; return ((DateTime)value).ToString("dd-MMM-yyyy"); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }WPF tag
<DatePicker Grid.Column="3" SelectedDate="{Binding DateProperty, Converter={StaticResource DateFormat}}" Margin="5"/>Надеюсь, это поможет
XAML
<DatePicker x:Name="datePicker" />C#
var date = Convert.ToDateTime(datePicker.Text).ToString("yyyy/MM/dd");Поместите любой формат, который вы хотите в ToString (""), например ToString ("dd MMM yyy"), и выходной формат будет 7 июня 2017
Формат экспонируется в зависимости от местоположения, но этого можно избежать, написав следующее:
ValueStringFormat="{}{0:MM'-'yy}" />И вы будете счастливы!(dd' - 'MM' - ' yyy)
Comments