2009-08-12 11 views
10

Chciałbym ustawić kulturę aplikacji WPF na konkretną na podstawie preferencji użytkownika.Jak globalnie ustawić kulturę w aplikacji WPF?

Mogę zrobić to dla bieżącego wątku przez Thread.CurrentThread.Current(UI)Culture, ale czy istnieje sposób, aby to zrobić globalnie dla aplikacji (tak, że domyślnie wpływa na wszystkie wątki)?

Odpowiedz

9

nie ma sposobu, aby ustawić go dla wszystkich wątków w aplikacji, jednak w przypadku tworzenia wątków w aplikacji można ustawić kultury dla wszystkich przez siebie, jak wspomniano powyżej

Aby ustawić kulturę na Głównym zastosowaniem użyć następującego kodu Snippet:

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

Jak mogę ustawić to w APP.xaml.cs? ustawić tę CultureInfo dla dowolnego wątku tego projektu? – Lai32290

7

Spróbuj umieścić

<UICulture>en-US</UICulture> 

... w pliku csproj.

3

Albo można spróbować to:

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

Hm, nie działa dla mnie, ale może coś zrobiłem źle. – Tarnschaf

+0

Musisz to zrobić przy uruchamianiu aplikacji przed załadowaniem drzewa wizualnego. – Darren

+0

Należy również wykonać polecenie 'System.Windows.Documents.TextElement' w celu przechwycenia znaczników' '(np. W elementach' TextBlock'), które nie dziedziczą z 'FrameworkElement'. – Grhm

0

Lub spróbuj budowania odpowiedniego Załączone obiekt tak

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, więc to co mogę używać, aby upewnić się, że wszystko z mojej aplikacji jest w kulturze amerykańskiej.

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)); 

w celu dokonania jednego wątku w kulturze można dokonać

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

Należy również wykonać polecenie 'System.Windows.Documents.TextElement', aby przechwycić znaczniki (np. W elementach' TextBlock'), które nie dziedziczą z 'FrameworkElement'. – Grhm

+0

Grhm co masz na myśli? – Gilad

+1

Mam kilka sekcji w mojej aplikacji, które wyglądają jak: ' Etykieta: ' Aby uzyskać numer sformatowany w odpowiednich ustawieniach narodowych, musiałem dodać 'FrameworkElement.LanguageProperty .OverrideMetadata (typeof (System.Windows.Documents.TextElement), nowy FrameworkPropertyMetadata ( XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.IetfLanguageTag))); 'oraz linie, o których wspomnieliśmy. Run nie dziedziczy z FrameworkElement (patrz http://msdn.microsoft.com/en-us/library/system.windows.documents.run(v=vs.110).aspx) – Grhm

Powiązane problemy