We are trying to allow the app to have its culture set at runtime and optionally override the way dates are displayed.
We create our own culture with:
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;
}
Then in the initialization of the app we do:
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)));
We set the "Sys.Workspace.ServerProperties.DateFormatOverride" value to be "dd-MMM-yyyy". This doesn't seem to be respected by the bindings though. For example:
<TextBlock TextAlignment="Center" HorizontalAlignment="Stretch"
Text="{Binding NoteDate, StringFormat={}{0:d}}" />
The NoteDate is a DataColumn
with type of DateTime
but displays the default cultures shortdate pattern.
If I set the main culture to en-GB I will get dd-mm-yyyy, if I set it to en-US I will get mm-dd-yyyy.
When I look at the Thread.CurrentThread.CurrentCulture
and currentUICulture it is set correctly, i.e. it is en-gb and the shortdatepattern and longdatepattern are dd-MMM-yyyy but the dates do not display in this format.
The reason is the FrameworkElement's don't look at the Thread.CurrentThread.CurrentCulture for globalisation info.
Instead you have to define the culture manually for XAML elements...