WPF的XAML StringFormatdate时间:错误的文化输出?

我在输出DateTime值时遇到了一些麻烦。 我的电脑目前的文化被设置为de-AT(奥地利)。

下面的代码

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

导致s1和s2的值都是“30.06.2009”。

但是在XAML中使用相同的格式

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

输出是“6/30/2009”。 看来XAML StringFormat忽略了当前的文化设置。 这发生在Vista和XP上。

我不想指定自定义格式,因为输出应该在用户的首选文化设置中进行格式化。

任何人都有同样的问题? 这是在WPF中的错误?

请参阅StringFomat本地化问题的答案

要应用http://tinyurl.com/b2jegna中提到的解决scheme,请执行以下操作:;

(1)将一个Startup事件处理程序添加到app.xaml中的Application类:

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

(2)添加处理函数:

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

WPFstring应根据文化进行正确的格式化。

前段时间写在我的博客上:

这将告诉你如何让WPF使用正确的文化:

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

当您修改控制面板中的设置时,这将改变WPF文化:

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

如果你想要一种特定的语言,你可以使用xml:lang将其设置在顶层元素上。

例如:

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

我知道这是一个老化的问题,但这一直对我有效,分享知识是件好事。 由于我的应用程序总是随时更改语言,因此FrameworkElement.LanguageProperty.OverrideMetadata仅适用于一次,对我不利,所以注意:

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

其中(this)是MainWindow,实际上你必须在所有的rootelements(Windows)中做。 在那里你已经够简单了。

你可以使用一个IValueConverter(它接受一个文化参数)和格式化值,我喜欢的是这个可空的转换器由马特汉密尔顿

 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 

}

inheritance人原来