Domanda

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.

È stato utile?

Soluzione

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...

Answered here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top