2010-09-29 3 views
31

Je dois modifier le format de chaîne de DatePickerTextBox dans le WPF ToolPort DatePicker, pour utiliser des traits d'union à la place des barres obliques pour les séparateurs.Modification du format de chaîne du WPF DatePicker

Existe-t-il un moyen de remplacer cette culture par défaut ou le format de chaîne d'affichage?

01-01-2010 

Répondre

76

J'ai résolu ce problème avec une aide de ce code. J'espère que cela vous aidera tous aussi.

<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> 
+0

thx, cela m'a aidé à résoudre entièrement d'utiliser le sélecteur de date pour sélectionner uniquement le mois. J'ai cité votre xaml dans http://stackoverflow.com/questions/1798513/wpf-toolkit-datepicker-month-year-only/14902905#14902905. – GameAlchemist

+2

Énorme fan de cette méthode. Je préfère faire cela plutôt que de changer la culture. – Dom

+0

Ceci est la vraie réponse! Actuellement, le hack sale est marqué comme la réponse. Pitié. – dzendras

5

Malheureusement, si vous parlez XAML, vous êtes coincé avec la mise SelectedDateFormat à « long » ou « court ».

Si vous avez téléchargé la source de la boîte à outils avec les fichiers binaires, vous pouvez voir comment elle est définie. Voici quelques-uns des moments forts de ce code:

DatePicker.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 
} 
20

Il semble, selon la réponse de Wonko, que vous ne pouvez pas spécifier le format Date au format Xaml ou en héritant du DatePicker.

J'ai mis le code suivant dans le constructeur de mon point de vue qui l'emporte sur le ShortDateFormat pour le thread courant:

CultureInfo ci = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name); 
ci.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy"; 
Thread.CurrentThread.CurrentCulture = ci; 
9

Le WPF Toolkit DateTimePicker a maintenant une propriété Format et une propriété FormatString. Si vous spécifiez Custom comme type de format, vous pouvez fournir votre propre chaîne de format.

<wpftk:DateTimePicker 
    Value="{Binding Path=StartTime, Mode=TwoWay}" 
    Format="Custom" 
    FormatString="MM/dd/yyyy hh:mmtt"/> 
1

classe Converter:

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(); 
    } 
} 

tag WPF

<DatePicker Grid.Column="3" SelectedDate="{Binding DateProperty, Converter={StaticResource DateFormat}}" Margin="5"/> 

Hope it helps

0

Format Exposée en fonction de l'emplacement, mais cela peut être évité en écrivant ceci:

! 10

Et vous serez heureux (dd « - » MM « - » yyy)

9

La réponse acceptée (merci @petrycol) m'a mis sur la bonne voie, mais je devenais une autre frontière de zone de texte et la couleur d'arrière-plan dans le sélecteur de date réelle. L'a corrigé en utilisant le code suivant.

 <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> 
+0

Parfait! travaillé comme un charme :-) – MaYaN

1

XAML

<DatePicker x:Name="datePicker" /> 

C#

var date = Convert.ToDateTime(datePicker.Text).ToString("yyyy/MM/dd"); 

mettre quel format que vous voulez dans ToString (""), par exemple ToString ("dd MMM yyy") et le format de sortie sera 7 juin 2017

Questions connexes