new net example clase asp c# wpf xaml datetime

c# - net - datetime wpf



WPF XAML StringFormat DateTime: ¿Salida en una cultura incorrecta? (6)

Tengo problemas con el resultado de un valor de DateTime. La cultura actual de mi computadora está configurada como de-AT (Austria).

El siguiente código

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

da como resultado que s1 y s2 tengan el valor correcto de "30.06.2009".

Pero cuando se utiliza el mismo formato en XAML

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

el resultado es `" 30/06/2009 ". Parece que XAML StringFormat ignora la configuración de cultivo actual. Esto sucede tanto en Vista como en XP.

No deseo especificar un formato personalizado, porque la salida debe formatearse en la configuración cultural preferida del usuario.

¿Alguien con el mismo problema? ¿Es esto un error en WPF?



Para aplicar la solución mencionada en http://tinyurl.com/b2jegna haga lo siguiente:

(1) Agregue un controlador de eventos de inicio a la clase de la aplicación en app.xaml:

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

(2) Agregue la función de controlador:

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

Las cadenas de WPF deben formatearse correctamente de acuerdo con la cultura.



Sé que esta es una pregunta que envejece, pero esto siempre me ha funcionado y compartir el conocimiento es algo bueno. Como mis aplicaciones siempre cambian de idioma sobre la marcha, FrameworkElement.LanguageProperty.OverrideMetadata solo funciona una vez y no es bueno para mí, así que he aquí:

this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(ActiveLanguage.CultureInfo.IetfLanguageTag);

donde (this) es MainWindow, en realidad tienes que hacerlo en todos los rootelements (Windows). Ahí vas lo suficientemente simple.


Si desea un idioma en particular, puede configurarlo en el elemento de nivel superior utilizando xml:lang .

Por ejemplo:

<Window xml:lang="de-AT"> ... </Window>


podrías usar un IValueConverter (que toma en un parámetro de cultivo) y formatear el valor como desees, algo que me gusta es este convertidor que acepta valores nulos de 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

}

Aquí está el original