2012-12-05 32 views
1

我們試圖允許應用程序在運行時設置其文化,並可以選擇重寫顯示日期的方式。WPF應用程序在使用stringformat = {} {0:d}時自定義shortdate

我們創造我們自己的文化有:

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但顯示默認培養shortdate圖案。

如果我將主要文化設置爲en-GB,我將得到dd-mm-yyyy,如果將其設置爲en-US,我將獲得mm-dd-yyyy。

當我查看Thread.CurrentThread.CurrentCulture和currentUICulture時,它設置正確,即它是en-gb,shortdatepattern和longdatepattern是dd-MMM-yyyy,但日期不以此格式顯示。

回答

1

原因是FrameworkElement的不查看全局信息的Thread.CurrentThread.CurrentCulture。

相反,你必須手動定義爲文化XAML元素......你MS

Answered here

+0

混賬,那只是討厭。最後,我爲每個綁定添加了一個datetimeconverter,至少它只在一個點上完成。 – Jon

+0

但是'LanguageProperty.OverrideMetadata(typeof(FrameworkElement),新的FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));'覆蓋那個,不是嗎? –