1 つのコントロールで日付の書式設定を変更するだけの場合は、アプリケーション全体のロケールを変更することはできません。にカスタムItemTemplate
をComboBox
設定し、 に を設定しStringFormat
ます。Binding
'dd/MM/yyyy'
アプリケーション全体で日付形式を本当に変更する必要があるが、他の形式はそのままにしておく場合は、現在のロケールに基づいて起動時にカスタム ロケールを適用できますが、WPF で適切に動作させるには厄介なリフレクションが必要です。 .
var currentCulture = CultureInfo.CurrentCulture;
if (currentCulture.IsReadOnly)
currentCulture = new CultureInfo(currentCulture.IetfLanguageTag, true);
currentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
// ...adjust other patterns accordingly...
// WARNING: Ugly reflection hacking ahead...
var defaultValueField = typeof(PropertyMetadata).GetField(
"_defaultValue",
BindingFlags.NonPublic | BindingFlags.Instance);
var equivalentCultureField = typeof(XmlLanguage).GetField(
"_equivalentCulture",
BindingFlags.NonPublic | BindingFlags.Instance);
if (defaultValueField != null &&
equivalentCultureField != null)
{
var xmlLanguage = XmlLanguage.GetLanguage(currentCulture.IetfLanguageTag);
equivalentCultureField.SetValue(
xmlLanguage,
currentCulture);
defaultValueField.SetValue(
FrameworkElement.LanguageProperty.DefaultMetadata,
xmlLanguage);
}
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;
起動プロセスのできるだけ早い段階で、必ずメイン スレッドから実行してください。ただし、これはWPF のビジュアル ビットだけでなく、プログラム全体に影響することに注意してください。たとえば、ログのタイムスタンプ形式などに影響を与える可能性があります。
yyyy-MM-dd
個人的には、複数のロケールを持つ会社で働く者として、すべての日付に ISO 標準形式を単純に使用する方が混乱が少ないと思います。d/MM/yyyy
およびMM/d/yyyy
形式は廃止する必要があります。