【问题标题】:My DateTime format changes when binding绑定时我的 DateTime 格式发生变化
【发布时间】:2014-03-15 14:50:53
【问题描述】:

我在英国,我的电脑总是显示英国日期格式 (dd/mm/yyyy)。

我的 WPF 项目出于某种原因将我的 DateTime 格式转换为美国类型。这发生在我的工作机器和家用机器上。

我已经能够非常简单地复制这个问题

<Window x:Class="TimeIssues.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBlock Text="{Binding MyTime}"></TextBlock> <!-- the value is 1/28/2014 10:15:37 (note it is M/dd/yyyy....)
</Grid>
</Window>

而在后面的代码中,简单的

public partial class MainWindow : Window
{
    public MainWindow()
    {
        SetMyTime("28/01/2014 10:15:37"); //note, this is dd/MM/yyyy .... format
        this.DataContext = this;
        InitializeComponent();
    }

    private void SetMyTime(string dateTime)
    {
        DateTime dt;
        DateTime.TryParseExact(dateTime, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
        MyTime = dt; // the value is expected, showing 28/01/2014 10:15:37
    }

    public DateTime MyTime { get; set; }
}

只是为了确认这不是 IT 问题(或者我认为),我的电脑设置为英国(并且位置也设置为英国,非 unicode 程序的当前语言也是如此)

我已阅读WPF format DateTime in TextBlock? 但这无济于事(我不认为),因为该问题是关于在格式已知时设置格式。

如果我将我的 MyTime 从 DateTime 更新为 string,那么结果就是预期的(英国格式)!问题是当类型是不需要的 DateTime 时,WPF 会更改格式!

我的问题是 2 倍 -

  1. 我不知道用户需要的格式(我的软件分布在世界各地)。
  2. WPF 似乎以任何方式错误地更改了格式!

如何告诉 WPF 使用用户的区域设置?有没有办法读取操作系统设置(根据上面的屏幕截图)?

【问题讨论】:

    标签: c# wpf datetime


    【解决方案1】:

    CultureInfo 是从 Thread 的当前文化中挑选出来的,在您的情况下将设置为 en-US。您需要将其设置为en-GB,如下所示:

    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");
    

    但是当您设置它时,您会看到,XAML 不会选择它。要让 XAML 选择它,您必须覆盖 FrameworkElement.LanguageProperty 元数据。

    在您的 App.xaml.cs 中覆盖 OnStartup() 方法并将此代码放在那里,您就可以开始了:

    protected override void OnStartup(StartupEventArgs e)
    {
       base.OnStartup(e);
    
       Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-GB");
       Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");
    
       FrameworkElement.LanguageProperty.OverrideMetadata(
                    typeof(FrameworkElement),
                    new FrameworkPropertyMetadata(
               XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
    }
    

    更新

    有没有办法读取操作系统设置(根据屏幕截图 以上)?

    如果您想根据为系统选择的格式选择CultureInfo,您也可以通过获取操作系统的 LCID 来做到这一点。这就是你的做法:

    [DllImport("kernel32.dll")]
    private static extern int GetUserDefaultLCID();
    
    protected override void OnStartup(StartupEventArgs e)
    {
       base.OnStartup(e);
    
       int machineLCID = GetUserDefaultLCID();
       CultureInfo machineCultureInfo = CultureInfo.GetCultureInfo(machineLCID);
       Thread.CurrentThread.CurrentUICulture = machineCultureInfo;
       Thread.CurrentThread.CurrentCulture = machineCultureInfo;
    
       FrameworkElement.LanguageProperty.OverrideMetadata(
                    typeof(FrameworkElement),
                    new FrameworkPropertyMetadata(
               XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
    }
    

    【讨论】:

    • 再次感谢 Rohit,但是,我的问题更多是 WPF 更改了格式。我正在开发的软件分布在世界各地,因此将其明确设置为 en-GB 是行不通的 :(
    • 那么您想从哪里挑选文化?一些配置文件或系统语言?
    • 我希望系统的语言。根据我的屏幕截图,操作系统让我们设置我们想要的格式,所以我希望信息可以使用?类似于(伪代码)DateTime.TryParse(currentTime, SystemDateFormat, out result)。或者这是一厢情愿而不是“标准方式”
    • @Dave Rook - 是的,你可以做到。请参阅答案中的更新。
    • @DaveRook - 这对你有用还是还在寻找其他东西?
    【解决方案2】:

    尝试类似 &lt;TextBlock Text="{Binding MyTime, ConverterCulture='en-GB'} &lt;/TextBlock&gt;.

    如果失败,请尝试&lt;TextBlock Text="{Binding MyTime, ConverterCulture='en-GB', StringFormat={}{0:dd/MM/yyyy} &lt;/TextBlock&gt;

    您可能会尝试的一件事是,不要返回 DateTime 对象,而是尝试让您的类根据运行程序的系统的当前 CultureInfo 获取/设置格式化字符串。这将按照您想要的方式绑定字符串,而不是 en-US 的默认 DateTime 绑定。

    【讨论】:

    • 我的帖子已经声明我可以使用字符串并且它有效?好像我在黑客攻击!
    • 抱歉,没看到。你需要它是一个 DateTime 对象吗?
    猜你喜欢
    • 2016-02-26
    • 2017-03-16
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多