2009-08-12 8 views
10

Je voudrais définir l'application Culture d'une application WPF à une application spécifique basée sur les préférences de l'utilisateur.Comment puis-je globalement définir la culture dans une application WPF?

Je peux le faire pour le thread en cours via Thread.CurrentThread.Current(UI)Culture, mais est-il possible de le faire globalement pour l'application (donc cela affecte tous les threads par défaut)?

Répondre

9

il n'y a aucun moyen de le régler pour tous les threads de l'application, si vous créez les threads dans votre application, vous pouvez définir la culture pour tout le monde par vous-même que vous avez mentionné ci-dessus

Pour définir la culture à l'application principale en utilisant ce code dans le code suivant:

Dim newCulture As CultureInfo = new CultureInfo("fr-FR") 
CurrentThread.CurrentCulture = newCulture 
+2

Comment puis-je mettre cela en App.xaml.cs? définir ce CultureInfo pour n'importe quel fil de ce projet? – Lai32290

7

Essayez de mettre

<UICulture>en-US</UICulture> 

... dans votre fichier csproj.

3

Ou vous pouvez essayer ceci:

FrameworkElement.LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(Markup.XmlLanguage.GetLanguage(Globalization.CultureInfo.CurrentCulture.IetfLanguageTag))) 
+0

Hm, n'a pas fonctionné pour moi mais peut-être que j'ai fait quelque chose de mal .. – Tarnschaf

+0

Vous devez le faire au démarrage de l'application avant de charger l'arbre visuel. – Darren

+0

Vous devez également faire 'System.Windows.Documents.TextElement' afin d'attraper les balises' '(par exemple dans les éléments' TextBlock') qui n'héritent pas de 'FrameworkElement'. – Grhm

0

Ou essayer de construire un lieu Attached propriété comme celui-ci

public class CultureHelper : DependencyObject 
{ 

    public string Culture 
    { 
     get { return (string)GetValue(CultureProperty); } 
     set { SetValue(CultureProperty, value); } 
    } 




    // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty CultureProperty = 
     DependencyProperty.RegisterAttached("Culture", typeof(string), typeof(CultureHelper), new FrameworkPropertyMetadata("en", CultureChanged)); 

    private static void CultureChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     //For testing purposes in designer only 
     if (DesignerProperties.GetIsInDesignMode(d)) 
     { 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo((string)e.NewValue); 
     } 

    } 

    public static void SetCulture(DependencyObject element, string value) 
    { 
     element.SetValue(CultureProperty, value); 
    } 

    public static string GetCulture(DependencyObject element) 
    { 
     return (string)element.GetValue(CultureProperty); 
    } 


} 
5

ok donc ce que j'utilise pour vous assurer que tous mon application est dans une culture en-US.

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); 
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US"); 
XmlLanaguage lang = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag); 
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(lang)); 
FrameworkContentElement.LanguageProperty.OverrideMetadata(typeof(System.Windows.Documents.TextElement), new FrameworkPropertyMetadata(lang)); 

afin de faire un seul fil dans une culture que vous pouvez faire

Thread.CurrentThread.CurrentCulture = new CultureInfo("EN-US"); 
Thread.CurrentThread.CurrentUICulture = new CultureInfo("EN-US"); 
+0

Vous devez également faire 'System.Windows.Documents.TextElement' afin d'attraper les balises (par exemple dans les éléments' TextBlock') qui n'héritent pas de 'FrameworkElement'. – Grhm

+0

Grhm que voulez-vous dire? – Gilad

+1

J'ai des sections dans mon application qui ressemblent à: ' Label: ' Afin d'obtenir le nombre formaté dans les bonnes locales, j'ai dû ajouter 'FrameworkElement.LanguageProperty .OverrideMetadata (typeof (System.Windows.Documents.TextElement), new FrameworkPropertyMetadata ( XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.IetfLanguageTag))); 'ainsi que les lignes mentionnées. L'exécution n'hérite pas de FrameworkElement (voir http://msdn.microsoft.com/en-us/library/system.windows.documents.run(v=vs.110).aspx) – Grhm

Questions connexes