61 votes

WPF XAML StringFormat DateTime: Sortie en mal de culture?

Je vais avoir quelques problèmes avec la sortie d'une valeur de type DateTime. Mon ordinateur actuel de la culture est définie de-AT (Autriche).

Le code suivant

string s1 = DateTime.Now.ToString("d");
string s2 = string.Format("{0:d}", DateTime.Now);

résultats s1 et s2 les deux ayant la valeur correcte de "30.06.2009".

Mais lorsque vous utilisez le même format XAML

    <TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat=d}"/>

la sortie est une sortie `"6/30/2009". Il semble que le XAML StringFormat ignore les paramètres de culture actuels. Ce qui se passe sur les deux Vista et XP.

Je ne veux pas de spécifier un format personnalisé, parce que la sortie doit être formaté dans le préféré de l'utilisateur paramètre de culture.

Quelqu'un avec le même problème? Est-ce un bug dans WPF?

42voto

loraderon Points 2751

15voto

Stephen Holt Points 1092

Pour appliquer la solution mentionnée à http://tinyurl.com/b2jegna procédez de la manière suivante:

(1) Ajouter un Démarrage du gestionnaire d'événement de la classe d'Application dans l'app.xaml:

<Application x:Class="MyApp"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ...
    Startup="ApplicationStartup">

(2) Ajout de la fonction de gestionnaire:

private void ApplicationStartup(object sender, StartupEventArgs e)
{
    FrameworkElement.LanguageProperty.OverrideMetadata(
        typeof(FrameworkElement),
        new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}

WPF chaînes doivent ensuite être mis en forme correctement en fonction de la culture.

10voto

Nir Points 18250

Écrit à ce sujet il y a quelques temps sur mon blog:

Cela vous indiquera comment obtenir WPF à utiliser le droit de la culture:

http://www.nbdtech.com/blog/archive/2009/02/22/wpf-data-binding-cheat-sheet-update-the-internationalization-fix.aspx

Cela va changer le WPF culture à la volée lorsque vous modifiez les paramètres dans le panneau de contrôle:

http://www.nbdtech.com/blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the-correct-regional.aspx

1voto

almog.ori Points 5145

vous pouvez utiliser un IValueConverter (qui prend dans une culture de paramètre) et le format de la valeur que vous voulez, quelque chose que j'aime, c'est ce nullable convertisseur par Matt Hamilton

class NullableDateTimeConverter : ValidationRule, IValueConverter
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    if (value == null || value.ToString().Trim().Length == 0) return null;

    return new ValidationResult( 
        ConvertBack(value, typeof(DateTime?), null, cultureInfo) != DependencyProperty.UnsetValue,
        "Please enter a valid date, or leave this value blank");
}

#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null) return "";
    DateTime? dt = value as DateTime?;
    if (dt.HasValue)
    {
        return parameter == null ? dt.Value.ToString() : dt.Value.ToString(parameter.ToString());
    }
    return ""; 
} 

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null || value.ToString().Trim().Length == 0) return null;
    string s = value.ToString();

    if (s.CompareTo("today") == 0) return DateTime.Today;
    if (s.CompareTo("now") == 0) return DateTime.Now;
    if (s.CompareTo("yesterday") == 0) return DateTime.Today.AddDays(-1);
    if (s.CompareTo("tomorrow") == 0) return DateTime.Today.AddDays(1);

    DateTime dt; 
    if (DateTime.TryParse(value.ToString(), out dt)) return dt; 

    return DependencyProperty.UnsetValue; 
}  
#endregion

}

heres l' original

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X