当前位置:  开发笔记 > Android > 正文

Wpf中的StringFormat本地化问题

如何解决《Wpf中的StringFormat本地化问题》经验,为你挑选了7个好方法。

在WPF 3.5SP1中,我使用DataBindings中的最后一个功能StringFormat:

     

我面临的问题是日期总是用英文格式化...虽然我的系统是法语的?我如何强制日期遵循系统日期?



1> loraderon..:
// Ensure the current culture passed into bindings is the OS culture.
// By default, WPF uses en-US as the culture, regardless of the system settings.
FrameworkElement.LanguageProperty.OverrideMetadata(
      typeof(FrameworkElement),
      new FrameworkPropertyMetadata(
          XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

从WPF中创建国际化向导


是的,这很烦人.+1
请注意,**Run**元素不会继承**FrameworkElement**,因此如果您将日期等绑定到**Run**,那么您将需要额外调用**typeof(System.Windows.Documents .跑)**
大.但是,如果文化在应用程序的生命周期中发生变化,该怎么办(例如,用户可以在设置对话框中更改其首选文化).根据文档FrameworkElement.LanguageProperty.OverrideMetadata不能多次调用(它抛出异常)
如果运行.net4,这似乎不起作用:'(
谢谢你解决我的头痛问题.

2> Gusdor..:

定义以下xml命名空间:

xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"

现在看到这个奇妙的解决方案:


我很清楚这不是一个全局性的解决方案,你会在每个Bindings上都需要它,但这肯定是好的XAML?据我所知,下次绑定更新时,它将使用正确的CultureInfo.CurrentCulture或您提供的任何内容.

这个解决方案将立即使用正确的值更新您的Bindings,但似乎很多代码都是如此罕见且无害.


优秀!这非常有用!将它添加到需要它的几个地方我没有问题.顺便说一句,你的例子缺少了}
优秀作品。太奇怪了,WPF默认使用美国英语,而不是当前的文化。

3> 小智..:

只需将文化快捷方式插入顶级标记:

xml:lang="de-DE"

例如:

....


但这与假设en-US是'正确'文化一样糟糕.它应该从用户的机器上获取设置.

4> Daniël Teunk..:

我只想补充一点,在大多数情况下,loraderon的答案很有用.当我在App.xaml.cs中放入以下代码行时,我的TextBlocks中的日期格式正确.

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

我说'大多数情况'.例如,这将开箱即用:


--> "16 mei 2013" (this is in Dutch)

...但是在TextBlock中使用Run时,DateTime的格式为默认文化.


  
  

--> "Datum: 16 may 2013" (this is in English, notice the
    name of the month "may" vs. "mei")

为了实现这一点,我需要Gusdor的答案,即将ConverterCulture = {x:Static gl:CultureInfo.CurrentCulture}添加到Binding中.


  
  

--> "Datum: 16 mei 2013" (=Dutch)

我希望这个额外的答案对某人有用.



5> 小智..:

如前所述,XAML默认为不变文化(en-US),您可以使用

FrameworkElement.LanguageProperty.OverrideMetadata(
  typeof(FrameworkElement),
  new FrameworkPropertyMetadata(
      XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

将文化设置为当前文化语言的默认文化.但评论是错误的; 这并没有使用目前的文化,因为你不会看到用户可能所做的任何定制,它永远是对语言的默认.

实际使用与自定义当前的文化,你将需要设置ConverterCulture与一起StringFormat,如

Text="{Binding Day, StringFormat='d', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}}"

gl您的根元素定义为一个全局命名空间

xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"



6> Peter..:

如果你需要在程序运行时更改语言,你只需更改根元素的语言属性(我不确定这是否具有即时效果,或者是否必须重新创建子元素,在我的情况下,这至少有效)

element.Language = System.Windows.Markup.XmlLanguage.GetLanguage(culture.IetfLanguageTag);



7> habakuk..:

切换本地化的完整代码也在以下元素中:

Private Shared Sub SetXamlBindingLanguage()

    '' For correct regional settings in WPF (e.g. system decimal / dot or comma) 
    Dim lang = System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(TextElement), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(DefinitionBase), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FixedDocument), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FixedDocumentSequence), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FlowDocument), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(TableColumn), New FrameworkPropertyMetadata(lang))
    FrameworkElement.LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(lang))

End Sub

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有