2009-06-30 9 views
53

मुझे डेटटाइम मान के आउटपुट के साथ कुछ परेशानी हो रही है। मेरे कंप्यूटर की वर्तमान संस्कृति डी-एटी (ऑस्ट्रिया) पर सेट है।डब्ल्यूपीएफ एक्सएएमएल स्ट्रिंगफॉर्मेट दिनांक समय: गलत संस्कृति में आउटपुट?

निम्नलिखित कोड

string s1 = DateTime.Now.ToString("d"); 
string s2 = string.Format("{0:d}", DateTime.Now); 

परिणाम एस 1 और s2 दोनों "2009/06/30" का सही मूल्य होने में।

लेकिन जब XAML

<TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat=d}"/> 

में एक ही प्रारूप का उपयोग कर उत्पादन `" 2009/06/30 "है। ऐसा लगता है कि एक्सएएमएल स्ट्रिंगफॉर्मैट वर्तमान संस्कृति सेटिंग्स को अनदेखा करता है। यह Vista और XP दोनों पर होता है।

मैं एक कस्टम प्रारूप निर्दिष्ट नहीं करना चाहता, क्योंकि आउटपुट को उपयोगकर्ता की पसंदीदा संस्कृति सेटिंग में स्वरूपित किया जाना चाहिए।

कोई भी समस्या वाला कोई भी व्यक्ति? क्या यह डब्ल्यूपीएफ में एक बग है?

+0

मुझे पूरे दिन पसीना पड़ा, मुझे यह समस्या आखिरी मिनट मिली! – GorillaApe

+1

इसे "डिजाइन द्वारा" माना जाता है। Https://connect.microsoft.com/VisualStudio/feedback/details/442569/wpf-binding-uses-the-wrong-currentculture-by-default –

+0

देखें, विंडोज फोन 7 पर वही व्यवहार देखा। ऑस्ट्रिया से नमस्ते! – hfrmobile

उत्तर

1

आप एक IValueConverter (जो एक संस्कृति पैरामीटर में ले जाता है) का उपयोग करें और मूल्य प्रारूप के रूप में आप चाहते हैं सकता है, कुछ मुझे पसंद मैट हैमिल्टन

class NullableDateTimeConverter : ValidationRule, IValueConverter 
{ 
public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
{ 
    if (value == null || value.ToString().Trim().Length == 0) return null; 

    return new ValidationResult( 
     ConvertBack(value, typeof(DateTime?), null, cultureInfo) != DependencyProperty.UnsetValue, 
     "Please enter a valid date, or leave this value blank"); 
} 

#region IValueConverter Members 
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value == null) return ""; 
    DateTime? dt = value as DateTime?; 
    if (dt.HasValue) 
    { 
     return parameter == null ? dt.Value.ToString() : dt.Value.ToString(parameter.ToString()); 
    } 
    return ""; 
} 

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value == null || value.ToString().Trim().Length == 0) return null; 
    string s = value.ToString(); 

    if (s.CompareTo("today") == 0) return DateTime.Today; 
    if (s.CompareTo("now") == 0) return DateTime.Now; 
    if (s.CompareTo("yesterday") == 0) return DateTime.Today.AddDays(-1); 
    if (s.CompareTo("tomorrow") == 0) return DateTime.Today.AddDays(1); 

    DateTime dt; 
    if (DateTime.TryParse(value.ToString(), out dt)) return dt; 

    return DependencyProperty.UnsetValue; 
} 
#endregion 

}

यहाँ

original द्वारा इस नल कनवर्टर है

9

अपने ब्लॉग पर कुछ समय पहले इसके बारे में लिखा:

+०१२३५१६४१०

यह आपको बता कैसे WPF सही संस्कृति उपयोग करने के लिए प्राप्त करने के लिए होगा:

http://www.nbdtech.com/blog/archive/2009/02/22/wpf-data-binding-cheat-sheet-update-the-internationalization-fix.aspx

इस मक्खी पर WPF संस्कृति बदल जाएगा जब आप नियंत्रण कक्ष में सेटिंग्स को संशोधित:

http://www.nbdtech.com/blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the-correct-regional.aspx

12

समाधान http://tinyurl.com/b2jegna में उल्लेख किया है लागू करने के लिए निम्न करें:

(1) एक प्रारंभ करें App.xaml में आवेदन वर्ग के लिए ईवेंट हैंडलर अप:

<Application x:Class="MyApp" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    ... 
    Startup="ApplicationStartup"> 

(2) जोड़े हैंडलर समारोह:

private void ApplicationStartup(object sender, StartupEventArgs e) 
{ 
    FrameworkElement.LanguageProperty.OverrideMetadata(
     typeof(FrameworkElement), 
     new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag))); 
} 

WPF तार तो संस्कृति के अनुसार सही ढंग से स्वरूपित किया जाना चाहिए।

3

यदि आप एक विशेष भाषा चाहते हैं, तो आप इसे xml:lang का उपयोग करके शीर्ष स्तर तत्व पर सेट कर सकते हैं।

उदाहरण के लिए:

<Window xml:lang="de-AT"> 
... 
</Window> 
3

मैं यह जान लें कि यह एक बुजुर्ग सवाल यह है कि लेकिन यह हमेशा मेरे लिए काम किया है और ज्ञान को साझा करने के लिए एक अच्छी बात है। चूंकि मेरे ऐप्स हमेशा फ्लाई पर भाषा बदलते हैं, फ्रेमवर्क एलिमेंट। लैंगेजप्रोपर्टी।OverrideMetadata केवल एक बार और मेरे लिए अपनी अच्छी नहीं होती है, अतः निहारना:

this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(ActiveLanguage.CultureInfo.IetfLanguageTag); 

जहां (यह), MainWindow है वास्तव में आप सभी rootelements में यह क्या करना है (विंडोज़)। वहां आप काफी सरल हो जाते हैं।

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