【问题标题】:Setting StringFormat for all DateTime objects globally independent of CultureInfo - WPF为全局独立于 CultureInfo 的所有 DateTime 对象设置 StringFormat - WPF
【发布时间】:2021-06-29 14:38:18
【问题描述】:

有没有什么方法可以在我的 WPF 应用程序中独立于 CultureInfo 为所有 DateTime 对象全局设置 StringFormat

我在整个应用程序中使用对此类对象的绑定,如下所示:

<DataGridTextColumn Header="Date" Binding="{Binding Date}"/>    

并且我想避免将StringFormat 参数添加到每个绑定。 我试图覆盖当前的文化DateTimeFormat 参数,如下所示:

public void SetDateTimeFormat()
{
    culture = Thread.CurrentThread.CurrentUICulture;
    var newCulture = new CultureInfo(culture.Name);

    // Set desired date format here
    newCulture.DateTimeFormat.ShortDatePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.LongDatePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.ShortTimePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.LongTimePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.FullDateTimePattern = "dd/MMM/YYYY";

    CultureInfo.DefaultThreadCurrentCulture = newCulture;
    CultureInfo.DefaultThreadCurrentUICulture = newCulture;

    Thread.CurrentThread.CurrentCulture = newCulture;
    Thread.CurrentThread.CurrentUICulture = newCulture;

        FrameworkElement.LanguageProperty.OverrideMetadata(
            typeof(FrameworkElement),
            new FrameworkPropertyMetadata(System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

        var lang = System.Windows.Markup.XmlLanguage.GetLanguage(newCulture.IetfLanguageTag);
        FrameworkContentElement.LanguageProperty.OverrideMetadata(
              typeof(System.Windows.Documents.TextElement),
              new FrameworkPropertyMetadata(lang)
            );
}

但它不起作用

【问题讨论】:

  • 这不是那个问题的重复。我的问题是显示 DateTime 绑定的标签没有检查 DateTimeFormat 模式,或者我的模式设置不正确。另外,我的格式不应该依赖于当前的文化。
  • 覆盖当前CultureInfo 中的内容是一个绝对可怕的想法,可能会在完全出乎意料的地方爆炸。不仅你在改变全局变量,你也在改变别人的全局变量——在这种情况下,是框架的。
  • Ok @AntonTykhyy 那么ai如何做到这一点?
  • 使用如下@mm8 建议的自定义绑定。

标签: c# wpf datetime datetime-format cultureinfo


【解决方案1】:

有没有办法在我的 WPF 应用程序中为所有 DateTime 对象全局设置 StringFormat,而与 CultureInfo 无关

DateTime 对象没有任何StringFormat,但Binding 有。你可以创建一个自定义的Binding 类:

public class MyCustomBinding : Binding
{
    public MyCustomBinding(string path)
        :base(path)
    {
        StringFormat = "yyyy-MM-dd";
    }
}

用法:

<DataGridTextColumn Header="Date" Binding="{local:MyCustomBinding Date}"/>

或者你可以设置元素的Language属性:

<DataGrid x:Name="dg" Language="en">

您也可以对 App.xaml.cs 中的所有元素全局执行此操作:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var culture = new CultureInfo("en");
        FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), 
            new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));
    }
}

【讨论】:

  • 好吧,我确实为我的应用程序中的所有元素设置了语言属性。但是现在显示的格式是 dd/MMM/YYYY hh:ss:mm 我想删除 hh:ss:mm 部分。有没有办法在全球范围内做到这一点?我不想编辑每个绑定。
  • 自定义绑定是要走的路——它清晰且具有声明性。只需将其命名为可以使意图显而易见的名称,例如InvariantDateBinding
【解决方案2】:

app.xaml.cs

  public App()
        {            
          
            CultureInfo ci = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
            ci.DateTimeFormat.ShortDatePattern = "M/d/yyyy";
            Thread.CurrentThread.CurrentCulture = ci;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多