2010-05-04 5 views
39

zeigt Warum diese CodezeileWPF String = {0: C} als Dollar

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

Ausgang das Ergebnis als xx.xx $, wenn alle meine regionalen Einstellungen Großbritannien gesetzt. Ich erwarte, dass es als £ xx.xx ausgegeben wird. Irgendwelche Ideen? Ich habe verschiedene Varianten des Stringformats einschließlich StringFormat = {} {0: C} ausprobiert, bekomme aber immer noch das gleiche Ergebnis.

Dank für das Schauen.

Antwort

62

Ich bin mir nicht sicher, ob dies in .NET 4 behoben wurde, aber WPF hat gepflückt nie die aktuelle Kultur auf, wenn Dinge wie Währung oder Termine zu machen. Es ist etwas, das ich für ein massives Versehen halte, aber glücklicherweise leicht korrigiert werden kann.

In Ihrer App Klasse:

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

Für weitere Informationen siehe this excellent post.

+0

Perfekt, ich habe eine Stunde lang versucht, eine Lösung zu finden, und Sie lösten es in 5 Minuten, danke. – Coesy

+1

Eigentlich nach [dieser Fehlerbericht an MS Connect] (https://connect.microsoft.com/VisualStudio/feedback/details/442569/wpf-binding-uses-the-wrong-currentculture-by-default), es ist kein Bug, sondern ein Feature * * wie MS staaten ... Ziemlich seltsam * Funktion *, würde ich sagen, aber es könnte gut zu wissen, dass dies in einer zukünftigen Version „fixiert“ werden unwahrscheinlich ist. – gehho

+4

Dies wird jedoch keine benutzerdefinierten Änderungen an den regionalen Einstellungen übernehmen (d. H. Ich verwende Deutsch, aber mit einem vernünftigen Datumsformat [ISO 8601]). Gibt es dafür auch einen Workaround? – Joey

13

Was funktioniert für mich:
1) In App.xaml Überschreibung OnStartup() und fügen Sie - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");

2) in XAML definieren @ Fensterebene - xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib"

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

Diese korrekt nimmt alle benutzerdefinierten regionalen Einstellungen. Obwohl ich einen manuell erstellen Culture im ersten Schritt bin mit, ich bin sicher, es ist möglich, in einen der statischen Typen passieren - zB. System.Globalization.CultureInfo.CurrentCulture (Ich habe es noch nicht getestet ...)

+0

Dies ist die beste Lösung, die ich gefunden habe, vielen Dank! –

+1

Dies hat das Problem der benutzerdefinierten Einstellungen gelöst. Für Schritt 1 habe ich "= new CultureInfo (CultureInfo.CurrentCulture.IetfLanguageTag)" verwendet, anstatt es hart zu codieren. – avenmore

+0

Ausgezeichnet, danke. Microsoft sollte das wirklich beheben. – Peter

18

Ich mache Language = "en-GB" im Hauptfenster z.

<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"> 
+0

Definitiv der schnellste Weg, wenn Sie ein Fenster aus dem Prototyping bauen! – Grim

+0

Lebensretter, ich liebe dich. Um Euro-Zeichen und Punkte in Komma (italienische Kultur) anzuzeigen: Sprache = "it-IT" in XAML, formatieren Sie die Zeichenfolge dann mit "€ #, ## 0.00" –

Verwandte Themen