web-dev-qa-db-fra.com

Modification du format de chaîne du DatePicker WPF

Je dois changer le format de chaîne de DatePickerTextBox dans DatePicker du WPF Toolkit, pour utiliser des traits d'union au lieu de barres obliques pour les séparateurs.

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

01-01-2010
40
benPearce

J'ai résolu ce problème avec l'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>
86
petrycol

Selon la réponse de Wonko, vous ne pouvez pas spécifier le format de date au format Xaml ou en héritant du DatePicker.

J'ai mis le code suivant dans le constructeur de ma vue, qui remplace le ShortDateFormat pour le thread actuel:

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

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"/>
11
Jordan Parmer

La réponse acceptée (merci @petrycol) m'a mis sur la bonne voie, mais j'obtenais une autre bordure de zone de texte et une couleur d'arrière-plan dans le sélecteur de date réel. 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>
10
Mark B

REMARQUE: cette réponse (écrite à l'origine en 2010) concerne les versions antérieures. Voir les autres réponses pour utiliser un format personnalisé avec les versions les plus récentes

Malheureusement, si vous parlez de XAML, vous ne pouvez pas définir SelectedDateFormat sur "Long" ou "Short". 

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 points 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
}
6
Wonko the Sane

XAML

 <DatePicker x:Name="datePicker" />

C #

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

mettez le format de votre choix dans ToString (""), par exemple ToString ("jj MMM aaa") et le format de sortie sera le 7 juin 2017

2
Usman Ali

Classe de convertisseur:

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

balise wpf

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

J'espère que ça aide

1
alkk

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

  ValueStringFormat="{}{0:MM'-'yy}" />

Et vous serez heureux! (Jj '-' MM '-' yyy)

0
Denis Prohorchik