programing

WPF XAML StringFormat DateTime:잘못된 문화에서 산출물?

codeshow 2023. 4. 12. 22:43
반응형

WPF XAML StringFormat DateTime:잘못된 문화에서 산출물?

DateTime 값 출력에 문제가 있습니다.제 컴퓨터의 현재 문화는 디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 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>

이것이 나이든 질문이라는 것을 알지만, 이것은 항상 나에게 효과가 있었고, 지식을 공유하는 것은 좋은 일입니다.내 앱은 항상 즉각적으로 언어를 변경하기 때문에 Framework Element.Language Property(언어 속성)Override Metadata는 한 번만 작동하며 나에게는 좋지 않습니다.

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

여기서 (이것은) Main Window 입니다.실제로 모든 Rootelements(Windows)에서 수행해야 합니다.자, 아주 간단해.

IValue Converter(배양 파라미터를 받아들임)를 사용하여 원하는 대로 값을 포맷할 수 있습니다.제가 좋아하는 것은 매트 해밀턴의 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

반응형