Programing

WPF XAML StringFormat DateTime : 잘못된 문화권의 출력?

lottogame 2020. 12. 2. 07:41
반응형

WPF XAML StringFormat DateTime : 잘못된 문화권의 출력?


DateTime 값의 출력에 문제가 있습니다. 내 컴퓨터의 현재 문화는 de-AT (오스트리아)로 설정되어 있습니다.

다음 코드

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

결과 s1과 s2는 모두 "30.06.2009"의 올바른 값을 갖습니다.

그러나 XAML에서 동일한 형식을 사용하는 경우

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

출력은` "6/30/2009"입니다. XAML StringFormat이 현재 문화 설정을 무시하는 것 같습니다. 이것은 Vista와 XP 모두에서 발생합니다.

출력은 사용자가 선호하는 문화 설정으로 형식을 지정해야하므로 사용자 지정 형식을 지정하고 싶지 않습니다.

같은 문제가있는 사람 있나요? WPF의 버그입니까?


제발 StringFomat 현지화 문제에 대한 내 대답을 참조


http://tinyurl.com/b2jegna에 언급 된 솔루션을 적용하려면 다음을 수행하십시오.

(1) app.xaml의 Application 클래스에 Startup 이벤트 핸들러를 추가합니다.

<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 문자열은 문화권에 따라 올바르게 형식이 지정되어야합니다.


얼마 전에 내 블로그에 썼습니다.

이것은 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


특정 언어를 원하면을 사용하여 최상위 요소에 설정할 수 있습니다 xml:lang.

예를 들면 :

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

나는 이것이 노화 질문이라는 것을 알고 있지만 이것은 항상 저에게 효과적이며 지식을 공유하는 것은 좋은 일입니다. 내 앱은 항상 즉석에서 언어를 변경하기 때문에 FrameworkElement.LanguageProperty.OverrideMetadata는 한 번만 작동하며 나에게 좋지 않습니다.

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

여기서 (이것은) MainWindow이며 실제로 모든 루트 요소 (Windows)에서 수행해야합니다. 당신은 충분히 간단합니다.


IValueConverter (문화 매개 변수를 취함)를 사용하고 원하는대로 값을 형식화 할 수 있습니다. 제가 좋아하는 것은 Matt Hamilton의 nullable 변환기입니다.

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

}

여기에 원본

참고 URL : https://stackoverflow.com/questions/1062160/wpf-xaml-stringformat-datetime-output-in-wrong-culture

반응형