【问题标题】:WPF application customize shortdate when using stringformat={}{0:d}使用 stringformat={}{0:d} 时 WPF 应用程序自定义 shortdate
【发布时间】:2012-12-05 09:53:57
【问题描述】:

我们正在尝试允许应用在运行时设置其文化,并可选择覆盖日期的显示方式。

我们通过以下方式创造自己的文化:

private CultureInfo CreateCulture()
    {
        // start with basic culture object
        CultureInfo culture = Sys.Workspace.ServerProperties.UICulture ?? new CultureInfo(Properties.Settings.Default.DefaultCulture);

        // override data format
        var dateFmt = Sys.Workspace.ServerProperties.DateFormatOverride;
        if (!string.IsNullOrEmpty(dateFmt))
        {
            culture.DateTimeFormat.ShortDatePattern = dateFmt;
            culture.DateTimeFormat.LongDatePattern = dateFmt;
            if (dateFmt.Contains("/")) culture.DateTimeFormat.DateSeparator = "/";
            if (dateFmt.Contains("-")) culture.DateTimeFormat.DateSeparator = "-";
        }

        return culture;
    }

然后在应用程序的初始化中我们这样做:

        var culture = CreateCulture();

        // set ui culture
        Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture;

        // set WPF culture
        LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));

我们将“Sys.Workspace.ServerProperties.DateFormatOverride”值设置为“dd-MMM-yyyy”。不过,绑定似乎并不尊重这一点。例如:

  <TextBlock TextAlignment="Center" HorizontalAlignment="Stretch" 
      Text="{Binding NoteDate, StringFormat={}{0:d}}" />

NoteDate 是 DataColumn,类型为 DateTime,但显示默认区域性短日期模式。

如果我将主要文化设置为 en-GB,我将获得 dd-mm-yyyy,如果我将其设置为 en-US,我将获得 mm-dd-yyyy。

当我查看Thread.CurrentThread.CurrentCulture 和 currentUICulture 时,它​​设置正确,即它是 en-gb,shortdatepattern 和 longdatepattern 是 dd-MMM-yyyy,但日期不以这种格式显示。

【问题讨论】:

    标签: wpf .net-3.5 datetime-format uiculture


    【解决方案1】:

    原因是 FrameworkElement 没有查看 Thread.CurrentThread.CurrentCulture 来获取全球化信息。

    相反,您必须为 XAML 元素手动定义区域性...

    Answered here

    【讨论】:

    • 该死的女士,这太恶心了。最后,我为每个绑定添加了一个 datetimeconverter,这样至少它只在一个时间点完成。
    • 但是LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag))); 涵盖了这一点,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2012-01-19
    • 2011-04-13
    • 2012-01-28
    • 2013-04-29
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多