2009-08-12 16 views
10

Me gustaría establecer la cultura de una aplicación WPF a una específica basada en las preferencias del usuario.¿Cómo puedo configurar globalmente Culture en una aplicación WPF?

Puedo hacer esto para el hilo actual a través de Thread.CurrentThread.Current(UI)Culture, pero ¿hay alguna manera de hacer esto globalmente para la aplicación (por lo que afecta a todos los hilos por defecto)?

Respuesta

9

no hay manera de configurarlo para todos los hilos en la aplicación, sin embargo, si va a crear los subprocesos de su aplicación se puede configurar la cultura para todo el mundo por sí mismo como usted ha mencionado anteriormente

Para establecer la cultura de la aplicación principal utilizar el siguiente fragmento de código:

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

Cómo puedo configurar esto en App.xaml.cs? establecer este CultureInfo para cualquier hilo de este proyecto? – Lai32290

7

trate de poner

<UICulture>en-US</UICulture> 

... en su archivo csproj.

3

O usted podría intentar esto:

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

Hm, no funcionó para mí, pero tal vez hice algo mal. – Tarnschaf

+0

Debe hacerlo al inicio de la aplicación antes de cargar el árbol visual. – Darren

+0

También necesita hacer 'System.Windows.Documents.TextElement' para capturar las etiquetas' '(por ejemplo, dentro de elementos' TextBlock') que no heredan de 'FrameworkElement'. – Grhm

0

O intentar la construcción de una propiedad asociada apropiada como esto

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

bien así que esto es lo que yo uso con el fin de asegurarse de que toda mi aplicación es en una cultura 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)); 

con el fin de hacer una única secuencia en una cultura puede hacer

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

También necesita hacer 'System.Windows.Documents.TextElement' para atrapar etiquetas (por ejemplo, dentro de elementos' TextBlock') que no heredan de 'FrameworkElement'. – Grhm

+0

Grhm, ¿qué quieres decir? – Gilad

+1

Tengo algunas secciones en mi aplicación que parecen: ' Etiqueta: ' Para obtener el número formateado en la configuración correcta, tuve que agregar 'FrameworkElement.LanguageProperty .OverrideMetadata (typeof (System.Windows.Documents.TextElement), new FrameworkPropertyMetadata ( XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.IetfLanguageTag))); 'así como las líneas que hemos mencionado. Ejecutar no hereda de FrameworkElement (ver http://msdn.microsoft.com/en-us/library/system.windows.documents.run(v=vs.110).aspx) – Grhm

Cuestiones relacionadas