109 wpf datetime localization
在WPF 3.5SP1中,我使用DataBindings中的最后一个功能StringFormat:
<TextBlock Text="{Binding Path=Model.SelectedNoteBook.OriginalDate, StringFormat='f'}"
FontSize="20" TextTrimming="CharacterEllipsis" />
Run Code Online (Sandbox Code Playgroud)
我面临的问题是日期总是用英文格式化...虽然我的系统是法语的?我如何强制日期遵循系统日期?
lor*_*ron 205
// 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)));
Run Code Online (Sandbox Code Playgroud)
Gus*_*dor 85
定义以下xml命名空间:
xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"
Run Code Online (Sandbox Code Playgroud)
现在看到这个奇妙的解决方案:
<TextBlock Text="{Binding Path=Model.SelectedNoteBook.OriginalDate, StringFormat='f', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}" FontSize="20"TextTrimming="CharacterEllipsis" />
Run Code Online (Sandbox Code Playgroud)
我很清楚这不是一个全局性的解决方案,你会在每个Bindings上都需要它,但这肯定是好的XAML?据我所知,下次绑定更新时,它将使用正确的CultureInfo.CurrentCulture或您提供的任何内容.
这个解决方案将立即使用正确的值更新您的Bindings,但似乎很多代码都是如此罕见且无害.
小智 10
只需将文化快捷方式插入顶级标记:
xml:lang="de-DE"
Run Code Online (Sandbox Code Playgroud)
例如:
<Window x:Class="MyApp"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xml:lang="de-DE"
Title="MyApp" Height="309" Width="497" Loaded="Window_Loaded">....</Window>
Run Code Online (Sandbox Code Playgroud)
Dan*_*ens 10
我只想补充一点,在大多数情况下,loraderon的答案很有用.当我在App.xaml.cs中放入以下代码行时,我的TextBlocks中的日期格式正确.
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
Run Code Online (Sandbox Code Playgroud)
我说'大多数情况'.例如,这将开箱即用:
<TextBlock Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}}" />
--> "16 mei 2013" (this is in Dutch)
Run Code Online (Sandbox Code Playgroud)
...但是在TextBlock中使用Run时,DateTime的格式为默认文化.
<TextBlock>
<Run Text="Datum: " />
<Run Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}, Mode=OneWay}" />
</TextBlock>
--> "Datum: 16 may 2013" (this is in English, notice the
name of the month "may" vs. "mei")
Run Code Online (Sandbox Code Playgroud)
为了实现这一点,我需要Gusdor的答案,即将ConverterCulture = {x:Static gl:CultureInfo.CurrentCulture}添加到Binding中.
<TextBlock>
<Run Text="Datum: " />
<Run Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}, ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}, Mode=OneWay}" />
</TextBlock>
--> "Datum: 16 mei 2013" (=Dutch)
Run Code Online (Sandbox Code Playgroud)
我希望这个额外的答案对某人有用.
小智 10
如前所述,XAML默认为不变文化(en-US),您可以使用
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
Run Code Online (Sandbox Code Playgroud)
将文化设置为当前文化语言的默认文化.但评论是错误的; 这并没有使用目前的文化,因为你不会看到用户可能所做的任何定制,它永远是对语言的默认.
实际使用与自定义当前的文化,你将需要设置ConverterCulture与一起StringFormat,如
Text="{Binding Day, StringFormat='d', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}}"
Run Code Online (Sandbox Code Playgroud)
与gl您的根元素定义为一个全局命名空间
xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"
Run Code Online (Sandbox Code Playgroud)
如果你需要在程序运行时更改语言,你只需更改根元素的语言属性(我不确定这是否具有即时效果,或者是否必须重新创建子元素,在我的情况下,这至少有效)
element.Language = System.Windows.Markup.XmlLanguage.GetLanguage(culture.IetfLanguageTag);
Run Code Online (Sandbox Code Playgroud)
切换本地化的完整代码也在以下元素中<Run />:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44345 次 |
| 最近记录: |