WPF 应用程序使用错误的语言来格式化 DateTime

WPF application use the wrong language for formatting DateTime

我正在使用 Visual Studio 2015 开发一个 WPF 应用程序,该应用程序以法语安装,但我使用的是英语语言包。我有一个法语 Windows 10,一个法语键盘布局,Windows 区域是加拿大。在我的应用程序中,我在 Application_Startup:

中使用以下代码将文化明确设置为 'en-CA'
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 的回答,在我的主要 windows' 构造函数中我这样做:

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 的格式使用几个月的法语缩写。 例如:之前:'14 Dec',在'14 déc.'之后

导致问题的按钮点击示例:

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    String s = DateTime.Now.ToString("dd MMM"); // this returns the french abbreviation
    Save();
}

我没有任何线程 运行 或触及其他任何地方文化的代码。我正在使用最新的 Entity Framework 来处理我的数据。

我可以根据需要显示更多代码,但我想不出任何其他相关的代码。

即使您没有显式创建新线程,框架也可能在调用您的事件处理程序之前就已经创建了。

如果您使用的是 .NET 4.5 或更新版本,请尝试设置 CultureInfo.DefaultThreadCurrentCultureCultureInfo.DefaultThreadCurrentUiCulture

MSDN documentation解释了这些新属性,但是它们的名字很self-explanatory。

如果未设置这些属性,新线程的文化默认为 OS 的文化。 Culture and threads 也是一本有趣的书。