WPF StringFormat={0:C} 显示为美元问题

48

为什么这行代码

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

当我的区域设置为英国时,将结果输出为$xx.xx。我希望它以£xx.xx的形式输出。有什么想法吗?我已经尝试了不同格式的字符串,包括StringFormat={}{0:C},但仍然得到相同的结果。

谢谢关注。

3个回答

75

我不确定在 .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);
 }

详细信息请参见这篇优秀的文章


1
实际上,根据MS Connect上的此错误报告,这不是一个错误,而是微软所说的一种特性...我会说这是相当奇怪的特性,但知道这在未来版本中不太可能被“修复”可能是有好处的。 - gehho
9
但是这种方法无法自定义地区设置(例如,我使用德语,但使用合理的日期格式[ISO 8601])。有没有解决这个问题的方法? - Joey
在我的情况下,我没有在“OnStartUp”事件中使用它。只需将其放在我的“问题窗口”加载之前就足够了。谢谢。 - itsho
错误报告链接到MS Connect已经消失,因为MS Connect已经不存在了。是否有一个有效的链接到MS Connect讨论关于WPF中不变文化作为一个特性的问题? - Rob Perkins

36

我在主窗口中使用英国英语(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">

1
救星啊,我爱你。为了显示欧元符号和点而不是逗号(意大利文化):在XAML中使用Language="it-IT",然后使用“€ #,##0.00”格式化字符串。 - Andrea Antonangeli
如果您需要格式化DataGridTextColumn,请使用以下内容:Binding="{Binding Path=PrezzoListino, ConverterCulture='it-IT', StringFormat='{0:€ #,##0.00}'}"在DataGridTextColumn中。示例适用于意大利文化、欧元货币和要绑定的“PrezzoListino”字段。 - Andrea Antonangeli

20

适用于我个人的方法:
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(我没有测试过...)


2
这解决了自定义设置的问题。在步骤1中,我使用了“= new CultureInfo(CultureInfo.CurrentCulture.IetfLanguageTag)”而不是硬编码它。 - avenmore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接