WPF应用程序在使用stringformat = {} {0:d}时自定义shortdate

时间:2012-12-05 09:53:57

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

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

我们用以下方式创建自己的文化:

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;
    }

然后在app的初始化中我们做了:

        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,但日期不会以这种格式显示。

1 个答案:

答案 0 :(得分:1)

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

相反,您必须手动为XAML元素定义文化...

Answered here