アプリが実行時にカルチャを設定できるようにし、必要に応じて日付の表示方法をオーバーライドできるようにしています。
私たちは独自の文化を創造します:
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
with タイプですDateTime
が、デフォルトのカルチャの shortdate パターンを表示します。
メイン カルチャを en-GB に設定すると、dd-mm-yyyy が取得されます。en-US に設定すると、mm-dd-yyyy が取得されます。
currentUICultureを見ると、Thread.CurrentThread.CurrentCulture
正しく設定されています。つまり、en-gb で、shortdatepattern と longdatepattern は dd-MMM-yyyy ですが、日付はこの形式で表示されません。