2010-05-04 80 views
39

为什么这行代码WPF的StringFormat = {0:C}显示为美元

<TextBlock Text="{Binding Net, StringFormat=c}"/> 

输出结果为$ XX.XX当我所有的区域设置被设置为英国。我希望它输出为£xx​​.xx。有任何想法吗?我尝试过不同的stringformat变体,包括StringFormat = {} {0:C},但仍然得到相同的结果。

感谢您的期待。

回答

62

我不确定这是否已在.NET 4中修复,但WPF在渲染像货币或日期之类的东西时从未接受过当前的文化。这是我认为是一个大规模的疏忽,但幸好很容易纠正。

在你的App类:

protected override void OnStartup(StartupEventArgs e) 
{ 
    FrameworkElement.LanguageProperty.OverrideMetadata(
     typeof(FrameworkElement), 
     new FrameworkPropertyMetadata(
      XmlLanguage.GetLanguage(
      CultureInfo.CurrentCulture.IetfLanguageTag))); 
    base.OnStartup(e); 
} 

更多信息请参见this excellent post

+0

完美,我花了一个小时试图找到解决方案,并在5分钟内解决了问题,谢谢。 – Coesy 2010-05-04 11:17:41

+1

实际上,根据[MS Connect上的这个错误报告](https://connect.microsoft.com/VisualStudio/feedback/details/442569/wpf-binding-uses-the-wrong-currentculture-by-default),它不是一个错误,而是一个*功能*,因为MS的状态......很奇怪的*功能*,我会说,但它可能是很好的知道,这是不太可能“固定”在未来的版本。 – gehho 2010-05-04 13:21:09

+4

尽管(虽然我使用德语,但具有健全的日期格式[ISO 8601]),但它不会选择区域设置的自定义更改。有没有解决方法呢? – Joey 2010-12-10 00:48:50

13

什么对我的作品:
1)在App.xaml中覆盖OnStartup(),并添加 - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");

2)定义在XAML @窗位 - xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib"

3)在XAML - <TextBox Text="{Binding Path=Price, StringFormat='{}{0:C}', ConverterCulture={x:Static sysglb:CultureInfo.CurrentUICulture}}" />

正确拿起任何定制区域设置。虽然我在第一步中使用手动创建的CultureInfo,但我确定可以传入其中一种静态类型 - 例如。 System.Globalization.CultureInfo.CurrentCulture(我还没有经过测试......)

+0

这是我找到的最佳解决方案,非常感谢! – 2013-05-10 14:00:11

+1

这确实解决了自定义设置问题。对于第1步,我使用了“=新CultureInfo(CultureInfo.CurrentCulture.IetfLanguageTag)”,而不是对其进行硬编码。 – avenmore 2014-10-01 11:31:25

+0

非常好,谢谢。微软真的应该解决这个问题 – Peter 2017-04-25 05:11:48

18

我在主窗口中做了Language =“en-GB”,例如

<Window x:Class="AllocateWPF.Vouchers" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Test" Height="692" Width="1000" Language="en-GB"> 
+0

绝对是您在原型开发窗口时最快捷的方式! – Grim 2015-11-06 10:32:10

+0

拯救生命,我爱你。要在XAML中显示逗号(意大利文化)的欧元符号和点intead:Language =“it-IT”,然后用“€#,## 0.00”格式化字符串 – 2016-01-29 17:45:59