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가 올바른 문화를 사용하도록 하는 방법에 대해 설명합니다.
제어판에서 설정을 변경하면 WPF 문화가 즉시 변경됩니다.
특정 언어를 원하는 경우 를 사용하여 최상위 요소로 설정할 수 있습니다.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
'programing' 카테고리의 다른 글
Bash에서 문자열을 배열로 분할하는 방법 (0) | 2023.04.12 |
---|---|
Bash에서 ${}와 $()의 차이 (0) | 2023.04.12 |
UICollor에서 약간 더 밝은 색상과 어두운 색상으로 구현 (0) | 2023.04.12 |
iOS에서 상태 표시줄 텍스트 색상을 변경하는 방법 (0) | 2023.04.12 |
UICollectionView자동 레이아웃을 사용한 셀 자체 크기 조정 (0) | 2023.04.12 |