2010-05-04 10 views
39

¿Por qué esta línea de códigoWPF StringFormat = {0: C} mostrando como dólares

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

salida el resultado como $ xx, xx, cuando todos mis ajustes regionales se establecen en el Reino Unido. Espero que salga como £ xx.xx. ¿Algunas ideas? He intentado diferentes variaciones del formato de cadena, incluido StringFormat = {} {0: C}, pero todavía obtengo el mismo resultado.

Gracias por mirar.

Respuesta

62

No estoy seguro de si esto se ha solucionado en .NET 4, pero WPF nunca ha recogido la cultura actual al representar cosas como moneda o fechas. Es algo que considero un descuido masivo, pero afortunadamente se corrige fácilmente.

En su clase de aplicación:

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

Ver this excellent post para más información.

+0

Perfecto, pasé una hora tratando de encontrar una solución y la resolvió en 5 minutos, gracias. – Coesy

+1

En realidad, de acuerdo con [este informe de error en MS Connect] (https://connect.microsoft.com/VisualStudio/feedback/details/442569/wpf-binding-uses-the-wrong-currentculture-by-default), no es un error, sino una * característica * como dice MS ... Característica bastante extraña *, diría, pero podría ser bueno saber que es poco probable que se "solucione" en una versión futura. – gehho

+4

Sin embargo, esto no recogerá cambios personalizados en la configuración regional (es decir, estoy usando alemán, pero con un formato de fecha [ISO 8601]). ¿Hay alguna solución para eso también? – Joey

13

Lo que funciona para mí:
1) En App.xaml anulación OnStartup() y añadir - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");

2) Definir en XAML @ nivel Ventana - 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}}" />

correctamente selecciona cualquier configuración regional personalizada. Aunque estoy usando un CultureInfo creado manualmente en el primer paso, estoy seguro de que es posible pasar uno de los tipos estáticos, por ejemplo. System.Globalization.CultureInfo.CurrentCulture (no lo he probado ...)

+0

Esta es la mejor solución que encontré, ¡muchas gracias! –

+1

Esto resolvió el problema de configuración personalizada. Para el paso 1, utilicé "= new CultureInfo (CultureInfo.CurrentCulture.IetfLanguageTag)" en lugar de codificarlo. – avenmore

+0

Excelente, gracias. Microsoft realmente debería arreglar esto. – Peter

18

I do Idioma = "en-GB" en la ventana principal, p.

<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

¡Definitivamente la forma más rápida de crear prototipos en una ventana! – Grim

+0

Ahorrador de vida, te amo. Para mostrar los signos y puntos del euro en las comas (cultura italiana): Language = "it-IT" en XAML, luego formatee la cadena con "€ #, ## 0.00" –

Cuestiones relacionadas