Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF文化问题_C#_Wpf_Cultureinfo_Culture_Currentculture - Fatal编程技术网

C# WPF文化问题

C# WPF文化问题,c#,wpf,cultureinfo,culture,currentculture,C#,Wpf,Cultureinfo,Culture,Currentculture,我想在我的应用程序主页上以法语格式显示日期: (年月日) 我使用实体框架对象,日期是绑定到xaml文件中组合框的实体列表的属性 我通过在我的应用程序启动时添加以下代码来解决此问题: FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement)、新FrameworkPropertyMetadata(xmlanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLa

我想在我的应用程序主页上以法语格式显示日期: (年月日) 我使用实体框架对象,日期是绑定到xaml文件中组合框的实体列表的属性

我通过在我的应用程序启动时添加以下代码来解决此问题:

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement)、新FrameworkPropertyMetadata(xmlanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag));
但我在这个添加中遇到了一个新问题:我的所有十进制数字在我的应用程序的其他页面中都使用逗号而不是点…ma应用程序不再适用于此更改

所以你能给我一个解决方案,以全球的方式解决这个问题。。。 总结一下,我需要法文日期格式和带点的十进制。 我希望不必更改代码每行的区域性

我已经尝试在相关页面中添加这一行,但没有成功

Thread.CurrentThread.CurrentCulture=System.Globalization.CultureInfo.InvariantCulture;

多亏了

一种解决方案是基于区域拥有具有相同键和值的不同资源文件,并使用区域性加载各自的区域值

一种解决方案是基于区域拥有具有相同键和值的不同资源文件,并使用区域性加载各自的区域值,如果您只想更改在单个控件中格式化日期,然后更改应用程序范围的区域设置不是实现这一点的方法。在
组合框上设置自定义
ItemTemplate
,并将
绑定上的
StringFormat
设置为
'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可视位。例如,它可能会影响日志中的时间戳格式等


就个人而言,作为一个在多个地区的公司工作的人,我发现对所有日期使用ISO标准
yyyy-MM-dd
格式就不会那么令人困惑了。
d/MM/yyyy
MM/d/yyyy
格式需要消失。

如果您只想在单个控件中更改日期的格式,那么更改应用程序范围的区域设置不是实现这一点的方法。在
组合框上设置自定义
ItemTemplate
,并将
绑定上的
StringFormat
设置为
'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可视位。例如,它可能会影响日志中的时间戳格式等


就个人而言,作为一个在多个地区的公司工作的人,我发现对所有日期使用ISO标准
yyyy-MM-dd
格式就不会那么令人困惑了。
d/MM/yyyy
MM/d/yyyyy
格式需要取消。

我已经尝试添加stringFormat,但它不起作用,给我的解决方案是添加代码:FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),new FrameworkPropertyMetadata(XmlLanguage.GetLanguage)(CultureInfo.CurrentCulture.IetfLanguageTag)));我再也找不到读过这篇文章的地方了,但在我添加了行之后,我的控件上的绑定和stringFormat工作了……是的,这段代码将更改WPF元素的默认显示区域性。我上面的代码也做了类似的更改,但我进一步将XmlLanguage重定向到自定义区域性。我已经尝试添加了stringFormat,但它不起作用,给我的解决方案是添加代码:FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IETFlangGuageTag)));我再也找不到读过这篇文章的地方了,但在我添加了行之后,我的控件上的绑定和stringFormat工作了……是的,这段代码将更改WPF元素的默认显示区域性。我上面的代码也做了类似的更改,但我进一步将XmlLanguage重定向到自定义区域性。