如果您只想在单个控件中更改日期的格式,那么更改应用程序范围的区域设置不是这样做的方法。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
需要消失。