2010-05-04 60 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