WPF XAML StringFormat DateTime: Output in wrong culture?

前端 未结 6 1473
南旧
南旧 2021-02-03 16:49

I\'m having some trouble with the output of a DateTime value. My computer\'s current culture is set to de-AT (Austria).

The following code

string s1 = Da         


        
相关标签:
6条回答
  • 2021-02-03 17:32

    you could use a IValueConverter (which takes in a culture parameter) and format the value as you wish, something I like is this nullable converter by Matt Hamilton

    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
    

    }

    heres the original

    0 讨论(0)
  • 2021-02-03 17:33

    Wrote about it some time ago on my blog:

    This will tell you how to get WPF to use the right culture:

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

    This will change the WPF culture on the fly when you modify the settings in the control panel:

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

    0 讨论(0)
  • 2021-02-03 17:34

    To apply the solution mentioned at http://tinyurl.com/b2jegna do the following:

    (1) Add a Startup event handler to the Application class in app.xaml:

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

    (2) Add the handler function:

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

    WPF strings should then be formatted correctly according to culture.

    0 讨论(0)
  • 2021-02-03 17:35

    Please see my answer on StringFomat Localization problem

    0 讨论(0)
  • 2021-02-03 17:42

    If you want one particular language, you can set it on the top level element using xml:lang.

    For example:

    <Window xml:lang="de-AT">
    ...
    </Window>
    
    0 讨论(0)
  • 2021-02-03 17:42

    I Know that this is an aging question but this has always worked for me and sharing knowledge is a good thing. Since my apps always change language on the fly, the FrameworkElement.LanguageProperty.OverrideMetadata only works once and its no good for me, so behold:

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

    where (this) is the MainWindow, actually you have to do it in all rootelements (Windows). There you go simple enough.

    0 讨论(0)
提交回复
热议问题