[wpf] wpf의 StringFormat 지역화 문제

WPF 3.5SP1에서는 DataBindings의 마지막 기능인 StringFormat을 사용합니다.

     <TextBlock Text="{Binding Path=Model.SelectedNoteBook.OriginalDate, StringFormat='f'}"
                FontSize="20" TextTrimming="CharacterEllipsis" />

내가 직면 한 문제는 날짜가 항상 영어로 형식화된다는 것입니다. 내 시스템은 프랑스어로되어 있지만? 날짜가 시스템 날짜를 따르도록하려면 어떻게해야합니까?



답변

// Ensure the current culture passed into bindings is the OS culture.
// By default, WPF uses en-US as the culture, regardless of the system settings.
FrameworkElement.LanguageProperty.OverrideMetadata(
      typeof(FrameworkElement),
      new FrameworkPropertyMetadata(
          XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

에서 WPF에서 국제화 마법사 만들기


답변

다음 xml 네임 스페이스를 정의하십시오.

xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"

이제이 환상적인 수정을보십시오.

<TextBlock Text="{Binding Path=Model.SelectedNoteBook.OriginalDate, StringFormat='f', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}" FontSize="20"TextTrimming="CharacterEllipsis" />

나는 이것이 글로벌 수정이 아니라는 것을 잘 알고 있으며 각 바인딩에 필요하지만 확실히 좋은 XAML입니까? 내가 아는 한, 다음에 바인딩이 업데이트되면 올바른 CultureInfo.CurrentCulture또는 귀하가 제공 한 것을 사용합니다 .

이 솔루션은 올바른 값으로 바인딩을 즉시 업데이트 하지만 매우 드물고 무해한 것에 대한 많은 코드처럼 보입니다.


답변

나는 loraderon 의 대답이 대부분의 경우 훌륭하게 작동 한다고 덧붙이고 싶었습니다 . App.xaml.cs에 다음 코드 줄을 넣으면 TextBlock의 날짜가 올바른 문화권으로 형식이 지정됩니다.

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

나는 ‘대부분의 경우’라고 말합니다.

<TextBlock Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}}" />
--> "16 mei 2013" (this is in Dutch)

… 그러나 TextBlock에서 Run을 사용할 때 DateTime은 기본 문화권으로 형식이 지정됩니다.

<TextBlock>
  <Run Text="Datum: " />
  <Run Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}, Mode=OneWay}" />
</TextBlock>
--> "Datum: 16 may 2013" (this is in English, notice the
    name of the month "may" vs. "mei")

이 작업을 수행하려면 Gusdor 의 대답이 필요 했습니다 . 즉, ConverterCulture = {x : Static gl : CultureInfo.CurrentCulture}를 바인딩에 추가했습니다.

<TextBlock>
  <Run Text="Datum: " />
  <Run Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}, ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}, Mode=OneWay}" />
</TextBlock>
--> "Datum: 16 mei 2013" (=Dutch)

이 추가 답변이 누군가에게 유용하기를 바랍니다.


답변

최상위 태그에 culture 바로 가기를 삽입하면됩니다.

xml:lang="de-DE"

예 :

<Window x:Class="MyApp"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xml:lang="de-DE"
    Title="MyApp" Height="309" Width="497" Loaded="Window_Loaded">....</Window>


답변

이미 언급했듯이 XAML의 기본값은 고정 문화 (en-US)이며 다음을 사용할 수 있습니다.

FrameworkElement.LanguageProperty.OverrideMetadata(
  typeof(FrameworkElement),
  new FrameworkPropertyMetadata(
      XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

문화를 현재 문화의 언어에 대한 기본 문화로 설정합니다. 그러나 그 말은 틀렸다. 이것은 현재 문화를 사용 하지 않습니다 . 사용자가 만든 사용자 정의를 볼 수 없기 때문에 항상 언어의 기본값이됩니다.

사용자 지정을 통해 현재 문화를 실제로 사용하려면에서 ConverterCulture와 같이를와 함께 설정해야합니다 StringFormat.

Text="{Binding Day, StringFormat='d', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}}"

gl루트 요소에 글로벌 네임 스페이스로 정의

xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"


답변

프로그램이 실행되는 동안 언어를 변경해야하는 경우 루트 요소의 Language 속성을 변경할 수 있습니다 (즉시 효과가 있는지 또는 하위 요소를 다시 만들어야하는지 확실하지 않습니다. 제 경우에는 이것이 작동합니다)

element.Language = System.Windows.Markup.XmlLanguage.GetLanguage(culture.IetfLanguageTag);


답변

다음과 같은 요소에서도 현지화를 전환하는 전체 코드 <Run />는 다음 과 같습니다.

Private Shared Sub SetXamlBindingLanguage()

    '' For correct regional settings in WPF (e.g. system decimal / dot or comma) 
    Dim lang = System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(TextElement), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(DefinitionBase), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FixedDocument), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FixedDocumentSequence), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FlowDocument), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(TableColumn), New FrameworkPropertyMetadata(lang))
    FrameworkElement.LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(lang))

End Sub