我們試圖允許應用程序在運行時設置其文化,並可以選擇重寫顯示日期的方式。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,但日期不以此格式顯示。
混賬,那只是討厭。最後,我爲每個綁定添加了一個datetimeconverter,至少它只在一個點上完成。 – Jon
但是'LanguageProperty.OverrideMetadata(typeof(FrameworkElement),新的FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));'覆蓋那個,不是嗎? –