web-dev-qa-db-fra.com

WPF StringFormat = {0: C} affiché en dollars

Pourquoi cette ligne de code

<TextBlock Text="{Binding Net, StringFormat=c}"/>

Générez le résultat sous la forme $ xx.xx lorsque tous mes paramètres régionaux sont définis sur UK. Je m'attends à ce qu'il le produise comme £ xx.xx. Des idées? J'ai essayé différentes variantes du format de chaîne, y compris StringFormat = {} {0: C} mais j'obtiens toujours le même résultat.

Merci d'avoir regardé.

46
Coesy

Je ne sais pas si cela a été corrigé dans .NET 4, mais WPF n'a jamais repris la culture actuelle lors du rendu de choses comme la devise ou les dates. C'est quelque chose que je considère comme un oubli massif, mais heureusement, il est facilement corrigé.

Dans votre classe App:

protected override void OnStartup(StartupEventArgs e)
{
    FrameworkElement.LanguageProperty.OverrideMetadata(
        typeof(FrameworkElement),
        new FrameworkPropertyMetadata(
            XmlLanguage.GetLanguage(
            CultureInfo.CurrentCulture.IetfLanguageTag)));
    base.OnStartup(e);
 }

Voir cet excellent article pour plus d'informations.

67
Matt Hamilton

Je fais Language = "en-GB" dans la fenêtre principale, par exemple.

<Window x:Class="AllocateWPF.Vouchers"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="Test" Height="692" Width="1000" Language="en-GB">
26
Michael Harper

Ce qui fonctionne pour moi:
1) Dans app.xaml, remplacez OnStartup () et ajoutez - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");

2) Définir au niveau XAML @ Window - xmlns:sysglb="clr-namespace:System.Globalization;Assembly=mscorlib"

3) En XAML - <TextBox Text="{Binding Path=Price, StringFormat='{}{0:C}', ConverterCulture={x:Static sysglb:CultureInfo.CurrentUICulture}}" />

Ceci correctement reprend tous les paramètres régionaux personnalisés. Bien que j'utilise un CultureInfo créé manuellement dans la première étape, je suis sûr qu'il est possible de passer dans l'un des types statiques - par exemple. System.Globalization.CultureInfo.CurrentCulture (Je ne l'ai pas testé cependant ...)

17
Marko