2009-06-13 7 views
4

Je constate un comportement incorrect des documents XAML lorsque la CurrentCulture est modifiée. Quand j'ai quelques éléments comme celui-ci dans une fenêtre:Liaisons XAML WPF et affichage CurrentCulture

<Window x:Class="WpfLocalizationLocBaml.Test" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib" 
     x:Name="wndTest" 
    Title="Test" Height="300" Width="300"> 
    <StackPanel> 

     <TextBlock x:Name="lblCultureName" 
        Text="{Binding Source={x:Static glob:CultureInfo.CurrentCulture}, 
            Path=DisplayName}" /> 


     <TextBlock x:Name="lblLocaleDateValue" 
        Text="{Binding ElementName=wndTest, Path=TestDate}"/> 

     <TextBlock x:Name="lblLocaleNumberValue" 
        Text="{Binding ElementName=wndTest,Path=NumberValue,StringFormat=c}" /> 

    </StackPanel> 
</Window> 

ainsi qu'un MessageBox.Show (NumberValue.ToString ("c")); quand le formulaire commence, je vois des résultats différents.

Si j'exécute le formulaire avec la langue par défaut tout va bien évidemment. Toutefois, si je change la culture dans le code ou au démarrage, les liaisons aux valeurs de date et de nombre affichent toujours un formatage en-US. La valeur MessageBox.Show() affichée de manière appropriée reflète la culture actuelle. Question: Est-ce que WPF ne respecte pas CurrentCulture dans les liaisons? Et si oui, qu'est-ce qui détermine exactement la culture utilisée pour les reliures? Il est clairement en-US dans mon cas, mais peu importe ce que je définis dans mon projet comme la langue par défaut, il se lie toujours en en-US.

... Toutes les idées appréciées

Répondre

18

Il se avère que WPF ne respecte pas la CurrentCulture par défaut dans les liaisons, et au lieu par défaut xml: Lang paramètre défini dans le document XAML ou en-US si non prévu. Il s'agit d'un comportement plutôt boiteux - vous ne savez pas pourquoi la mise en forme automatique de la culture ne s'appliquerait pas comme toutes les autres technologies UI, mais ...

Heureusement, il existe une solution de contournement qui peut être appliquée dans le constructeur du document ou dans une base Windows/UserControl. classe:

 // MAKE SURE you set the language of the page explicitly or else 
     // all number and date formatting occurs using 
     this.Language = XmlLanguage.GetLanguage(
         CultureInfo.CurrentCulture.IetfLanguageTag); 

Il y a plus d'informations disponibles dans ce blog:

http://www.west-wind.com/weblog/posts/796725.aspx

+0

Juste ce dont j'avais besoin pour mon application Windows Phone 7 - avec une légère modification de: - this.Language = XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.Name); –

+2

Vous pouvez le faire dans App.cs pour toutes les liaisons comme expliqué ici: http://stackoverflow.com/questions/2764615/wpf-stringformat-0c-showing-as-dollars – Heiner

+1

'IetfLanguageTag' est obsolète. '.Name' peut être utilisé à la place. – Mafii

1

Il est également intéressant de souligner que la même chose se produit dans Silverlight, avec t La même solution sauf pour permuter IetfLanguageTag pour Name.