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
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>
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;
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"/>
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>
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
}
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
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
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)