1

アプリが実行時にカルチャを設定できるようにし、必要に応じて日付の表示方法をオーバーライドできるようにしています。

私たちは独自の文化を創造します:

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 はDataColumnwith タイプですDateTimeが、デフォルトのカルチャの shortdate パターンを表示します。

メイン カルチャを en-GB に設定すると、dd-mm-yyyy が取得されます。en-US に設定すると、mm-dd-yyyy が取得されます。

currentUICultureを見ると、Thread.CurrentThread.CurrentCulture正しく設定されています。つまり、en-gb で、shortdatepattern と longdatepattern は dd-MMM-yyyy ですが、日付はこの形式で表示されません。

4

1 に答える 1

1

その理由は、FrameworkElement が Thread.CurrentThread.CurrentCulture をグローバリゼーション情報として参照しないためです。

代わりに、XAML 要素のカルチャを手動で定義する必要があります...

ここで回答済み

于 2012-12-05T11:33:49.490 に答える