2010-05-04 10 views
39

क्यों कोड की इस पंक्तिWPF StringFormat = {0: सी} डॉलर के रूप में दिखा

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

आउटपुट $ xx.xx के रूप में परिणाम जब मेरे सभी क्षेत्रीय सेटिंग ब्रिटेन की तैयारी में हैं करता है। मैं इसे £ xx.xx के रूप में आउटपुट करने की उम्मीद करता हूं। कोई विचार? मैंने स्ट्रिंगफॉर्मैट = {} {0: सी} सहित स्ट्रिंगफॉर्मेट के विभिन्न बदलावों का प्रयास किया है लेकिन फिर भी वही परिणाम मिलता है।

देखने के लिए धन्यवाद।

उत्तर

62

मुझे यकीन नहीं है कि यह .NET 4 में तय किया गया है, लेकिन WPF ने मुद्रा या तिथियों जैसी चीजें प्रदान करते समय वर्तमान संस्कृति को कभी नहीं उठाया है। यह कुछ है जो मैं बड़े पैमाने पर निरीक्षण पर विचार करता हूं, लेकिन शुक्र है कि आसानी से सही किया जाता है।

अपने ऐप वर्ग में:

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

+1

दरअसल, [एमएस कनेक्ट पर यह बग रिपोर्ट] के अनुसार (https://connect.microsoft.com/VisualStudio/feedback/details/442569/wpf-binding-uses-the-wrong-currentculture-by-default), यह एक बग नहीं है, लेकिन एक * फीचर * एमएस राज्यों के रूप में ... सुंदर अजीब * फीचर *, मैं कहूंगा, लेकिन यह जानना अच्छा होगा कि भविष्य के संस्करण में यह "निश्चित" होने की संभावना नहीं है। – gehho

+4

हालांकि यह क्षेत्रीय सेटिंग्स में कस्टम बदलाव नहीं उठाएगा (यानी मैं जर्मन का उपयोग कर रहा हूं, लेकिन एक सैने दिनांक प्रारूप [आईएसओ 8601] के साथ)। क्या इसके लिए कोई कामकाज भी है? – Joey

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 का उपयोग कर रहा हूं, मुझे यकीन है कि स्थिर प्रकारों में से एक में पास करना संभव है - उदाहरण के लिए। सिस्टम। ग्लोबलाइजेशन। कल्चरइन्फो। कंटेंटकल्चर (मैंने इसका परीक्षण नहीं किया है ...)

+0

यह सबसे अच्छा समाधान मैंने पाया, बहुत बहुत धन्यवाद! –

+1

इससे कस्टम सेटिंग्स समस्या हल हुई। चरण 1 के लिए मैंने हार्ड-कोडिंग के बजाय "= new CultureInfo (CultureInfo.CurrentCulture.IetfLanguageTag)" का उपयोग किया। – avenmore

+0

उत्कृष्ट, धन्यवाद। माइक्रोसॉफ्ट वास्तव में इसे ठीक करना चाहिए। – Peter

18

मैं मुख्य विंडो में भाषा = "एन-जीबी" करता हूं उदा।

<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

+0

लाइफ सेवर, मैं तुमसे प्यार करता हूँ। अल्पविराम (इतालवी संस्कृति) के यूरो साइन और डॉट्स इंटीड दिखाने के लिए: XAML में भाषा = "यह-आईटी", फिर स्ट्रिंग को "€ #, ## 0.00" के साथ प्रारूपित करें –

संबंधित मुद्दे