2009-12-17 17 views
13

Devo supportare la modifica della lingua dell'interfaccia utente tramite il menu dell'applicazione. I testi sono localizzate utilizzando file di risorse (simile ad avvicinarsi 1 here)Forza aggiornamento UI al volo, dopo aver modificato la cultura corrente in WPF

se ho impostato il Thread.CurrentThread.CurrentUICulture prima che le chiamate al ctor InitializeComponent(), l'interfaccia utente viene modificata come dovrebbe.

Tuttavia, se il CurrentUICulture viene modificato durante l'esecuzione normale dell'applicazione, i controlli non vengono aggiornati (ovvero il testo rimane lo stesso, indipendentemente dalla cultura corrente).

C'è un modo per forzare l'aggiornamento dei controlli in base allo CurrentUICulture?

risposta

10

È possibile utilizzare the ResourceDictionary approach insieme allo DynamicResourceMarkupExtension. Utilizzando questo approccio è possibile scambiare il dizionario delle risorse che rappresenta la lingua selezionata dall'utente e lo DynamicResourceMarkupExtension assicurerà che il nuovo valore si rifletta nell'interfaccia utente.

Inoltre, se sei disposto ad avventurarti nel regno di una soluzione personalizzata, c'è lo LocalizeMarkupExtension fornito in this WPF tutorial.

+1

Drew Marsh, il collegamento ResourceDictionary non è più valido. Puoi indicare il nuovo collegamento in .net 4.5? – bschandramohan

+0

Il link sembra essere valido. Il titolo della pagina dice "How to: Use a ResourceDictionary per gestire le risorse stringa localizzabili". –

2

Supponendo che il DataContext per il menu è un oggetto che implementa INotifyPropertyChanged, è possibile aggiornare tutti i comandi specificando null (niente) in caso PropertyChanged ...

da msdn:

Il PropertyChanged evento può indicare tutte le proprietà sull'oggetto hanno modificato utilizzando un riferimento null (Nothing in Visual Basic) o String.Empty come nome della proprietà in the PropertyChangedE ventArgs.

+1

Grazie. Tuttavia, la maggior parte dell'interfaccia utente sono solo stringhe statiche e quindi senza alcun DataContext. – Elad

0

Un modo che ho provato e funziona bene è questo metodo, per richiamare dopo l'assegnazione della proprietà nel ViewModel:

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); 
} 
Problemi correlati