Changer le format de chaîne de caractères du lecteur de données WPF
je dois changer le format de la chaîne de caractères de la boîte de dialogue de données dans le WPF Toolkit DatePicker, pour utiliser des traits d'Union plutôt que des barres obliques pour les séparateurs.
y a-t-il un moyen de remplacer cette culture par défaut ou le format de chaîne d'affichage?
01-01-2010
8 réponses
j'ai résolu ce problème avec l'aide de ce code. Espérons, vous aidera à tous.
<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>
il semble, selon la réponse de Wonko, que vous ne pouvez pas spécifier le format de la Date au format Xaml ou en héritant du lecteur de données.
j'ai mis le code suivant dans le constructeur de ma vue qui remplace le ShortDateFormat pour le thread courant:
CultureInfo ci = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
ci.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy";
Thread.CurrentThread.CurrentCulture = ci;
WPF Toolkit DateTimePicker
a maintenant un Format
propriété et un FormatString
propriété. 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 boîte de texte et la couleur de fond dans le vrai date picker. 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>
NOTE: Cette réponse (écrite à l'origine en 2010) est pour les versions précédentes. Voir d'autres réponses pour utiliser un format personnalisé avec des versions plus récentes
malheureusement, si vous parlez de XAML, vous êtes coincé avec selecteddateformat de "Long" ou "court".
si vous avez téléchargé la source de la boîte à outils avec les binaires, vous pouvez voir comment elle est définie. Voici certains des points saillants de cette 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;
}
Datapickerformat.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
}
classe du 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();
}
}
wpf balise
<DatePicker Grid.Column="3" SelectedDate="{Binding DateProperty, Converter={StaticResource DateFormat}}" Margin="5"/>
j'Espère que ça aide
XAML
<DatePicker x:Name="datePicker" />
C#
var date = Convert.ToDateTime(datePicker.Text).ToString("yyyy/MM/dd");
mettre ce que jamais le format que vous souhaitez dans ToString("") par exemple ToString("jj MMM aaaa") et le format de sortie sera de 7 Juin 2017
le Format présenté dépend de l'endroit mais cela peut être évité en écrivant ceci:
ValueStringFormat="{}{0:MM'-'yy}" />
Et vous serez heureux!(jj'-'MM'-'yyy)