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가 올바른 문화를 사용하도록하는 방법을 알려줍니다.
이렇게하면 제어판에서 설정을 수정할 때 즉시 WPF 문화가 변경됩니다.
특정 언어를 원하면을 사용하여 최상위 요소에 설정할 수 있습니다 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
'Programing' 카테고리의 다른 글
Datomic은 언제 사용해야합니까? (0) | 2020.12.02 |
---|---|
MismatchSenderId를받는 FCM (0) | 2020.12.02 |
PHP 이미지 업로드 보안 검사 목록 (0) | 2020.12.02 |
Android : 버튼 텍스트 및 배경색 변경 (0) | 2020.12.01 |
동일한 클래스의 다른 버전에 대한 플레이버 빌드 (0) | 2020.12.01 |