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使用正确的文化:
当您修改控制面板中的设置时,这将改变WPF文化:
如果你想要一种特定的语言,你可以使用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人原来