2009-12-17 12 views
13

necesito para apoyar el cambio idioma de la interfaz a través del menú de la aplicación. Los textos se localizan mediante archivos de recursos (similar a acercarse a 1 here)Forzar actualización de interfaz de usuario sobre la marcha, después de cambiar la cultura actual en WPF

si fijo el Thread.CurrentThread.CurrentUICulture antes de que las llamadas a ctor InitializeComponent(), la interfaz de usuario se cambia como debería.

Sin embargo, si el CurrentUICulture se cambia durante el funcionamiento normal de la aplicación, los controles no se actualizan (es decir, el texto sigue siendo el mismo, independientemente de la cultura actual).

¿Hay alguna manera de forzar que los controles se actualicen según el CurrentUICulture?

Respuesta

10

Puede usar the ResourceDictionary approach junto con el . Con este enfoque, puede cambiar el diccionario de recursos que representa el idioma que el usuario ha seleccionado y el DynamicResourceMarkupExtension asegurará que el nuevo valor se refleje en la interfaz de usuario.

Además, si está dispuesto a aventurarse en el ámbito de una solución personalizada, está el LocalizeMarkupExtension que se proporciona en this WPF tutorial.

+1

Drew Marsh, el enlace ResourceDictionary ya no es válido. ¿Puedes señalar el nuevo enlace en .net 4.5? – bschandramohan

+0

El enlace parece ser válido. El título de la página dice "Cómo: Usar un ResourceDictionary para administrar recursos de cadenas localizables". –

2

Suponiendo que el DataContext para el menú es un objeto que implementa INotifyPropertyChanged, puede actualizar todos los controles especificando nula (nada) en caso PropertyChanged ...

de msdn:

El PropertyChanged evento puede indicar todas las propiedades del objeto tienen cambiado mediante el uso de una referencia nula (Nothing en Visual Basic) o String.Empty como nombre de propiedad en PropertyChangedE ventArgs.

+1

Gracias. Sin embargo, la mayoría de la IU son solo cadenas estáticas y, por lo tanto, sin ningún DataContext. – Elad

0

Una forma que probé y funciona bien es este método, para llamar después de la transmisión de la propiedad en el modelo de vista:

private void AllowUiToUpdate() 
{ 
    var frame = new DispatcherFrame(); 

    var dispatcherOperationCallback = new DispatcherOperationCallback(delegate 
     { 
      frame.Continue = false; 
      return null; 
     }); 

    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, dispatcherOperationCallback, null); 

    Dispatcher.PushFrame(frame); 
} 
Cuestiones relacionadas