WPF 应用程序使用错误的语言来设置日期时间的格式
本文关键字:设置 日期 时间 格式 语言 错误 WPF 应用程序 | 更新日期: 2023-09-27 18:27:23
我正在使用Visual Studio 2015开发WPF应用程序,该应用程序以法语安装,但我使用的是英语语言包。我有一个法语Windows 10,法语键盘布局,Windows区域是加拿大。在我的应用程序中,我使用以下代码将区域性显式设置为"en-CA"Application_Startup:
var culture = CultureInfo.GetCultureInfo("en-CA");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
然后,按照 SO 的答案,在我的主窗口的构造函数中,我这样做:
this.Language = XmlLanguage.GetLanguage("en-CA");
在列表视图中,我使用对象的 DisplayString 属性显示一个对象,该属性为:
return Start.ToString("dd MMM") // Start is a DateTime
列表视图定义为
<ListView x:Name="lvEntries" Margin="435,81,10,5" SelectionChanged="lvEntries_SelectionChanged"
SelectionMode="Single" MaxHeight="516" HorizontalAlignment="Left" Height="412" VerticalAlignment="Top" FontFamily="Consolas" >
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn Header="Period" DisplayMemberBinding="{Binding DisplayString}" />
<GridViewColumn Header="Project" DisplayMemberBinding="{Binding ProjectName}" />
</GridView>
</ListView.View></ListView>
当应用程序启动时,一切正常,但是在任何按钮单击后,DateTime的格式都会使用法语缩写数月。例如:之前:"12 月 14 日","公元 14 日"之后。
导致问题的按钮单击示例:
private void btnSave_Click(object sender, RoutedEventArgs e)
{
String s = DateTime.Now.ToString("dd MMM"); // this returns the french abbreviation
Save();
}
我没有任何线程正在运行,也没有代码在其他任何地方触及文化。我正在使用最新的实体框架来处理我的数据。
我可以根据需要显示更多代码,尽管我想不出任何其他可能相关的代码。
即使你没有显式创建新线程,框架也可能在调用事件处理程序之前完成。
如果您使用的是 .NET 4.5 或更高版本,请尝试设置 CultureInfo.DefaultThreadCurrentCulture
和 CultureInfo.DefaultThreadCurrentUiCulture
。
MSDN 文档解释了这些新属性,但它们的名称不言自明。
如果未设置这些属性,则新线程的区域性默认为 OS 的区域性。《文化与线索》也是一本有趣的读物。